SoftCraft
разноликое программирование

Top.Mail.Ru

Нейроинформатика. Учебное пособие


Оглавление | Введение | П1 | П2 | П3 | Литература
Лекции: 1, 2-3, 4-6, 7.1, 7.2, 8, 9, 10, 11.1, 11.2-12, 13-14, 15-16


Стандарт нейрокомпьютера

В этом приложении описаны стандарты двух уровней. Стандарт первого уровня это стандарт на языки описания всех компонентов нейрокомпьютера, за исключением компонента исполнитель. Компонент исполнитель не имеет стандарта первого уровня в следствие своей универсальности. Стандарт второго уровня – описание запросов, выполняемых каждым компонентом. Структура приложения. В первой части приложения описаны общие для всех компонентов элементы стандарта. В каждой следующей части описывается стандарт первого или второго уровня для каждого компонента.

Общий стандарт

Этот раздел содержит описание элементов стандарта, общих для всех компонентов нейрокомпьютера.

Стандарт типов данных

При описании запросов, структур данных, стандартов компонентов нейрокомпьютера необходимо использовать набор первичных типов данных. Поскольку в разных языках программирования типы данных называются по-разному, введем единый набор обозначений для них.

Таблица 1.

Типы данных для всех компонентов нейрокомпьютера

Тип Длина (байт) Значения Описание
Color 2   Используется для задания цветов. Является совокупностью из 16 элементарных (битовых) флагов. См. раздел «Цвет и операции с цветами».
Real 4 от ±1.5 e- 45
до ±3.4 e 38
Действительное число. Величина из указанного диапазона.. В дальнейшем называется «действительное».
RealArray 4*N   Массив действительных чисел.
PrealArray 4   Используется для передачи массивов между компонентами. Имеет значение адреса массива действительных чисел.
Integer 2 от -32768
до 32767
Целое число из указанного диапазона. В дальнейшем называется «целое».
IntegerArray 2*N   Массив целых чисел.
PintegerArray 4   Используется для передачи массивов между компонентами. Имеет значение адреса массива целых чисел.
Long 4 от -2147483648
до 2147483647
Целое число из указанного диапазона. В дальнейшем называется «длинное целое».
LongArray 4*N   Массив длинных целых чисел.
PlongArray 4   Используется для передачи массивов между компонентами. Имеет значение адреса массива длинных целых чисел.
Logic 1 True, False Логическая величина. Далее называется «логическая».
Logic 1 True, False Логическая величина. Далее называется «логическая».
LogicArray N   Массив логических переменных.
PlogicArray 4   Используется для передачи массивов между компонентами. Имеет значение адреса массива логических переменных.
FuncType 4   Адрес функции. Используется при необходимости передать функцию в качестве аргумента.
Visual 4   Отображаемый элемент. Служит для адресации отображаемых элементов в интерфейсных функциях. Тип значений зависит от реализации библиотеки интерфейсных функций и не может изменяться пользователем иначе, чем через вызов интерфейсной функции.
String 256   Строка символов.
PString 4   Адрес строки символов. Служит для передачи строк в запросах
Pointer 4   Не типизованный указатель (адрес). Этот тип совместим с любым типизованным указателям.

Числовые типы данных Integer, Long и Real предназначены для хранения различных чисел. Переменные числовых типов допускаются в языках описания всех компонентов нейрокомпьютера. При необходимости записать в один массив числовые переменные различного типа следует использовать функции приведения типов, описанные в разделе «Приведение типов»

Строка. Символьный тип данных предназначен для хранения комментариев, названий полей, имен сетей, оценок и другой текстовой информации. Все строковые переменные занимают 256 байт и могут включать в себя до 255 символов. Первый байт строки содержит длину строки. В переменных типа строка возможен доступ к любому символу как к элементу массива. При этом длина имеет индекс ноль, первый символ – 1 и т.д.

Указатель на строку. При передаче данных между компонентами сети и процедурами в пределах одного компонента удобно вместо строки передавать указатель на строку, поскольку указатель занимает всего четыре байта. Для этой цели служит тип указатель на строку.

Логический тип используется для хранения логических значений. Значение истина задается предопределенной константой True, значение ложь – False.

Массивы. В данном стандарте предусмотрены массивы четырех типов – логических, целочисленных, длинных целых и действительных переменных. Длины массивов определяются при описании, но все массивы переменных одного типа относятся к одному типу, в отличие от языков типа Паскаль. Использование функций приведения и преобразования типов позволяют получать из этих массивов структуры произвольной сложности. Элементы массивов всегда нумеруются с единицы.

Вне зависимости от типа массива нулевой элемент массива имеет тип Long и содержит длину массива в элементах. На рис. 1 приведена схема распределения памяти всех типов массивов, каждый из которых содержит шесть элементов.

Все массивы, как правило, используется только в пределах одного компонента. При передаче массивов между компонентами или между процедурами в пределах одного компонента используются указатели на массивы.

Адрес функции. Этот тип используется для передачи функции в качестве аргумента. Переменная типа FuncType занимает четыре байта и является адресом функции. В зависимости от реализации по этому адресу может лежать либо начало машинного кода функции, либо начало текста функции. В случае передачи текста функции первые восемь байт по переданному адресу содержат слово «Function».

Отображаемый элемент. Переменные типа Visual (отображаемый элемент) Служат для адресации отображаемых элементов в интерфейсных функциях. Тип значений зависит от реализации библиотеки интерфейсных функций и не может изменяться пользователем иначе, чем через вызов интерфейсной функции. Особо следует отметить, что библиотека интерфейсных функций не является частью ни одного из компонентов.

Переменные типа цвет и операции с цветами

Использование цветов позволяет гибко разбивать множества на подмножества. В нейрокомпьютере возникает необходимость в разбиении на подмножества (раскрашивании) задачника. В этом разделе описывается стандарт работы с переменными типа цвет.

Значение переменной типа цвет (Color)

Переменная типа цвет представляет собой двухбайтовое беззнаковое целое. Однако основное использование предполагает работу не как с целым числом, а как с совокупностью однобитных флагов. При записи на диск используется символьное представление двоичной записи числа с ведущими нулями и разбиением на четверки символом «.» (точка), предваряемая заглавной буквой «B» латинского алфавита, или символьное представление шестнадцатеричной записи числа с ведущими нулями, предваряемая заглавной буквой «H» латинского алфавита. В табл. 2 приведена нумерация флагов (бит) переменной типа Color, их шестнадцатеричное, десятичное и дво ичное значение. При использовании в учителе или других компонентах может возникнуть необходимость в присвоении некоторым из флагов или их комбинаций имен. На такое именование не накладывается никаких ограничений, хотя возможно будет выработан стандарт и на названия часто используемых цветов (масок, совокупностей флагов).

Таблица 2

Нумерация флагов (бит) переменной типа Color

Номер Шестнад-цатиричная запись Деся-тичная запись Двоичная запись Номер Шестнад-цатиричная запись Деся-тичная запись Двоичная запись
0 H0001 1 B.0000.0000.0000.0001 8 H0100 256 B.0000.0001.0000.0000
1 H0002 2 B.0000.0000.0000.0010 9 H0200 512 B.0000.0010.0000.0000
2 H0004 4 B.0000.0000.0000.0100 10 H0400 1024 B.0000.0100.0000.0000
3 H0008 8 B.0000.0000.0000.1000 11 H0800 2048 B.0000.1000.0000.0000
4 H0010 16 B.0000.0000.0001.0000 12 H1000 4096 B.0001.0000.0000.0000
5 H0020 32 B.0000.0000.0010.0000 13 H2000 8192 B.0010.0000.0000.0000
6 H0040 64 B.0000.0000.0100.0000 14 H4000 16384 B.0100.0000.0000.0000
7 H0080 128 B.0000.0000.1000.0000 15 H8000 32768 B.1000.0000.0000.0000

Операции с переменными типа цвет (Color)

Таблица 3
Предопределенные константы операций с переменными типа Цвет (Color)
Код Обозна-чение Вычисляемое
выражение
Тип
результата
Пояснение
1 CEqual A = B Logic Полное совпадение.
2 CIn A And B = A Logic A содержится в В.
3 CInclude A And B = B Logic А содержит В.
4 CExclude A And B = 0 Logic A и В взаимоисключающие.
5 CIntersect A And B <> 0 Logic А и В пересекаются.
6 COr A Or B Сolor Побитное включающее или.
7 CAnd A And B Color Побитное и.
8 CXor A Xor B Color Побитное исключающее или
9 CNot Not A Color Побитное отрицание

В табл. 3 приведены операции с переменными типа Color. Первые пять операций могут использоваться только для сравнения переменных типа Color, а остальные четыре операции – для вычисления выражений типа Color.

В ряде запросов необходимо указать тип операции над цветом. Для передачи таких параметров используется переменная типа Integer. В качестве значений передается содержимое соответствующей ячейки столбца код табл. 3.

Приведение и преобразование типов

Есть два пути использовать переменную одного типа как переменную другого типа. Первый путь состоит в преобразовании значения к заданному типу. Так, для преобразования целочисленной переменной к действительному типу, достаточно просто присвоить переменной действительного типа целочисленное значение. С обратным преобразованием сложнее, поскольку не ясно что делать с дробной частью. В табл. 4 приведены все типы, которые можно преобразовать присваиванием переменной другого типа. В табл. 5 приведены все функции преобразования типов.

Таблица 4

Преобразование типов прямым присваиванием переменной значения выражения

Тип
переменной
Тип
выражения
Пояснение
Real Real, Integer, Long Значение преобразуется к плавающему виду. При преобразовании значения выражения типа Long возможна потеря точности.
Long Integer, Long При преобразовании типа Integer, действуют следующие правила. Значение переменной помещается в два младших байта. Если значение выражения больше либо равно нолю, то старшие байты равны H0000, в противном случае старшие байты равны HFFFF.
Integer Integer, Long При преобразовании выражения типа Long значение двух старших байт отбрасывается.

Таблица 5

Функции преобразования типов

Имя функции Тип аргумента Тип результата Описание
Real Real, Integer, Long Real Аналогично прямому присваиванию
Integer Integer, Long Integer Аналогично прямому присваиванию
Long Integer, Long Long Аналогично прямому присваиванию
Str Real, Long, Integer String Представляет числовой аргумент в виде символьной строки в десятичном виде
Round Real Long Округляет действительное значение до ближайшего длинного целого. Если значение действительного выражения выходит за диапазон длинного целого, то результат равен нулю.
Truncate Real Long Преобразует действительное значение в длинное целое путем отбрасывания дробной части. Если значение действительного выражения выходит за диапазон длинного целого, то результат равен нулю.
LVal String Long Преобразует длинное целое из символьного представления во внутреннее.
RVal String Real Преобразует действительное число из символьного представления во внутреннее.
StrColor Color String Преобразует внутреннее представление переменной типа Color в соответствии с разд. «Значение переменной типа цвет»
ValColor String Color Преобразует символьное представление переменной типа Color во внутреннее.
Color Integer Color Интерпретирует целое число как значение типа Color.

При вычислении числовых выражений действуют следующие правила преобразования типов:

  1. Выражения вычисляются слева на право.
  1. Если два операнда имеют один тип, то результат имеет тот же тип.
  1. Если аргументы имеют разные типы, то выражение имеет старший из двух типов. Список числовых типов по убыванию старшинства: Real, Long, Integer.
  1. Результат операции деления действительных чисел (операция «/») всегда имеет тип Real, вне зависимости от типов аргументов.

В отличие от преобразования типов приведение типов позволяет по-разному интерпретировать одну область памяти. Функция приведения типа применима только к переменным или элементам массива (преобразование типов применимо и к выражениям). Рекомендуется использовать приведение типов только для типов, имеющих одинаковую длину. Например, Integer и Color или Real и Long. Список функций приведения типов приведен в табл. 6.

Таблица 6

Функции приведения типов

Название Тип результата Описание
Treal Real Четыре байта, адресуемые приводимой переменной, интерпретируются как действительное число.
Tinteger Integer Два байта, адресуемые приводимой переменной, интерпретируются как целое число.
Tlong Long Четыре байта, адресуемые приводимой переменной, интерпретируются как длинное целое.
TrealArray RealArray Область памяти, адресуемая приводимой переменной, интерпретируются как массив действительных чисел.
TPRealArray PRealArray Четыре байта, адресуемые приводимой переменной, интерпретируются как указатель на массив действительных чисел.
TintegerArray IntegerArray Область памяти, адресуемая приводимой переменной, интерпретируются как массив целых чисел.
TPIntegerArray PIntegerArray Четыре байта, адресуемые приводимой переменной, интерпретируются как указатель на массив целых чисел.
TlongArray LongArray Область памяти, адресуемая приводимой переменной, интерпретируются как массив длинных целых.
TPLongArray PLongArray Четыре байта, адресуемые приводимой переменной, интерпретируются как указатель на массив длинных целых.
Tlogic Logic Адресуемый приводимой переменной байт интерпретируются как логическая переменная.
TlogicArray LogicArray Область памяти, адресуемая приводимой переменной, интерпретируются как массив логических переменных.
TPLogicArray LogicArray Четыре байта, адресуемые приводимой переменной, интерпретируются как указатель на массив логических переменных.
TColor Color Два байта, адресуемые приводимой переменной, интерпретируются как переменная типа цвет.
TFuncType FuncType Четыре байта, адресуемые приводимой переменной, интерпретируются как адрес функции.
TPointer Pointer Четыре байта, адресуемые приводимой переменной, интерпретируются как адрес.
Tstring String 256 байт области памяти, адресуемой приводимой переменной, интерпретируются как строка символов.
TPString PString Четыре байта, адресуемые приводимой переменной, интерпретируются как указатель на строку символов.
Tvisual Visual Четыре байта, адресуемые приводимой переменной, интерпретируются как отображаемый элемент.

Следующие примеры иллюстрируют использование преобразования и приведения типов:

При вычислении следующих четырех выражений, получаются различные результаты

4096 * 4096 = 0

Поскольку константа 4096 имеет тип Integer, а 4096 * 4096 = 16777216 = 256 * 65536 , то есть младшие два байта результата равны нулю.

Long(4096 * 4096) = 0

Поскольку оба сомножителя имеет тип Integer, то и выражение имеет тип Integer. Следовательно, результат умножения равен нулю, который затем преобразуется к типу Long.

Long(4096) * 4096 = 16777216

Поскольку первый сомножитель имеет тип длинное целое, то и выражение имеет тип длинное целое.

4096.0 * 4096 = 1.677722E+7

Поскольку первый сомножитель имеет тип Real, то и выражение имеет тип Real. Из-за недостатка точности произошла потеря точности в седьмом знаке.

В следующем примере, используя приведение типов, в массив действительных чисел A размером в 66 элементов складываются: действительное число в первый элемент массива; длинное целое во второй элемент массива и символьную строку в элементы с 3 по 66.

A[1] = 1.677722E+7

TLong(A[2]) = 16777216

TString(A[3]) = ‘Пример приведения типов’

Необходимо отметить, что элементы массива A, начиная со второго, после выполнения приведенного выше фрагмента программы не рекомендуется использовать как действительные числа, поскольку элемент A[2] содержит значение 2.350988Е-38, а элемент A[5] – значение -4.577438Е-18. Значение элементов, начиная с A[8] (символьная строка ‘Пример приведения типов’ содержит 23 символа и занимает 24 байта, то есть шесть элементов массива) вообще не зависят от приведенного фрагмента программы и содержат «мусор», который там находился ранее.

В списке типов определены только одномерные массивы. Однако, при необходимости, возможно использование двумерных массивов. Для этого в одномерный массив A необходимо поместить указатели на одномерные массивы. При этом I,J-й элемент двумерного массива записывается в виде:

TPRealArray(A[I])^[J]

В этом примере использована функция приведения типов TPRealArray, указывающая, что I-й элемент массива A нужно интерпретировать как указатель на одномерный массив действительных чисел, и операция «^» указывающая, что вместо указателя на массив TPRealArray(A[I]) используется массив, на который он указывает.

Таким образом, использование функций приведения типов позволяет из одномерных массивов строить структуры произвольной сложности. В языках программирования, таких как C и Паскаль, существует возможность строить пользовательские типы данных. При разработке стандарта эти возможности были исключены, поскольку использование пользовательских типов, облегчая написание программ, сильно затрудняет разработку компилятора или интерпретатора, а при использовании этого языка для описания компонентов нейрокомпьютера необходимость в пользовательских типах данных возникает чрезвычайно редко. Например, при описании примеров всех компонентов, приведенных в данной работе, такая необходимость ни разу не возникла.

Операции

В данном разделе приведены все операции, которые могут быть использованы при построении выражений различного типа. В табл. 7 приведены операции, которые допустимы в целочисленных выражениях (выражениях типа Integer или Long). В табл. 8 – список, дополняющий список операций из табл. 7 до полного списка операций, допустимых в выражениях действительного типа. В табл. 9 – операции, допустимые при построении логических выражений. В табл. 10 –для выражений типа символьная строка. В табл. 3 – для выражений типа Color. Если операндом может быть любой числовой тип, то вместо перечисления всех числовых типов (Integer, Real, Long) указывается слово «числовой»

Таблица 7

Операции, допустимые в целочисленных выражениях

Прио-ритет Обозна-
чение
Тип 1-го
операнда
Тип 2-го
операнда
Тип
результата
Название операции
1 * Integer Integer Integer Умножение
1 * Long Integer Long Умножение
1 * Integer Long Long Умножение
1 * Long Long Long Умножение
1 Div Integer Integer Integer Целочисленное деление
1 Div Integer Long Long Целочисленное деление
1 Div Long Integer Long Целочисленное деление
1 Div Long Long Long Целочисленное деление
1 Mod Integer Integer Integer Остаток от деления
1 Mod Long Integer Long Остаток от деления
1 Mod Integer Long Long Остаток от деления
1 Mod Long Long Long Остаток от деления
2 + Integer Integer Integer Сложение
2 + Integer Long Long Сложение
2 + Long Integer Long Сложение
2 + Long Long Long Сложение
2 Integer Integer Integer Вычитание
2 Integer Long Long Вычитание
2 Long Integer Long Вычитание
2 Integer Long Long Вычитание
2 Long Integer Long Вычитание
2 Long Long Long Вычитание
3 And Integer Integer Integer Побитное И
3 And Long Long Long Побитное И
3 Or Integer Integer Integer Побитное включающее ИЛИ
3 Or Long Long Long Побитное включающее ИЛИ
3 Xor Integer Integer Integer Побитное исключающее ИЛИ
3 Xor Long Long Long Побитное исключающее ИЛИ
3 Not Integer Integer Integer Побитное отрицание
3 Not Long Long Long Побитное отрицание

Таблица 8

Операции, дополняющие список операций из табл. 7 до полного списка операций, допустимых в выражениях действительного типа.

Приоритет Обозначение Тип 1-го операнда Тип 2-го операнда Тип результата Название операции
1 * Real числовой Real Умножение
1 / числовой числовой Real Деление
1 RMod числовой числовой Real Остаток от деления
2 + Real числовой Real Сложение
2 Real числовой Real Вычитание

Таблица 9

Операции, допустимые при построении логических выражений

Прио-ритет. Обозна-
чение
Тип 1-го
операнда
Тип 2-го
операнда
Тип
результата
Название операции
1 > числовой числовой Logic Больше
1 < числовой числовой Logic Меньше
1 >= числовой числовой Logic Больше или равно
1 <= числовой числовой Logic Меньше или равно
1 = числовой числовой Logic Равно
1 <> числовой числовой Logic Не равно
2 And Logic Logic Logic Логическое И
2 Or Logic Logic Logic Логическое включающее ИЛИ
2 Xor Logic Logic Logic Логическое исключающее ИЛИ
2 Not Logic Logic Logic Логическое отрицание

Таблица 10

Операции для выражений типа символьная строка

Прио-ритет Обозна-чение Тип 1-го
операнда
Тип 2-го
операнда
Тип
результата
Название операции
1 + String String String Конкатенация (сцепка) строк.

Во всех таблицах операции размещаются по убыванию приоритета. Для каждой операции указаны допустимые типы операндов, и тип результата, в зависимости от типов операндов.

В табл. 8 приводится необычная операция RMod – остаток от деления действительных чисел. Результат этой функции равен разности между первым операндом и вторым операндом, умноженным на целую часть отношения первого операнда ко второму.

Кроме операций, приведенных в табл. 3 и табл. 7–10, определены две взаимно обратные операции для работы с адресами и указателями:

^ – ставится после переменной типа указатель. Означает, что вместо указателя в выражении используется переменная или массив, на который указывает этот указатель. Не допускается после переменных типа Pointer.

@ – ставится перед именем переменной любого типа. Означает, что в выражении участвует не переменная, а адрес переменной. Используется при присвоении адресов переменных или массивов переменным типа указатель.

Предопределенные константы

При описании различных компонентов возникает необходимость в использовании некоторого набора стандартизированных констант. Стандартность набора констант особенно необходима при обмене между компонентами. Все константы, приведенные в табл. 11, описываются в тех разделах, где они используются. В табл. 11 для каждой константы указывается ее тип, значение и названия разделов, в которых она описывается.

Таблица 11

Предопределенные константы

Идентификатор Тип Значение Раздел
Шестнад. Десят.
BackInSignals Integer H0005 5 Запросы к компоненту сеть
BackOutSignals Integer H0006 6 Запросы к компоненту сеть
BackÐarameters Integer H0007 7 Запросы к компоненту сеть
Binary Integer H0001 1 Запросы компонента интерпретатор ответа
BinaryPrep Integer H0000 0 Запросы компонента предобработчик
BynaryCoded Integer H0003 3 Запросы компонента интерпретатор ответа
CAnd Integer H0007 7 Операции с переменными типа цвет (Color)
Cascad Integer H0002 2 Запросы к компоненту сеть
CEqual Integer H0001 1 Операции с переменными типа цвет (Color)
CExclude Integer H0004 4 Операции с переменными типа цвет (Color)
CicleFor Integer H0003 3 Запросы к компоненту сеть
CicleUntil Integer H0004 4 Запросы к компоненту сеть
CIn Integer H0002 2 Операции с переменными типа цвет (Color)
CInclude Integer H0003 3 Операции с переменными типа цвет (Color)
CIntersect Integer H0005 5 Операции с переменными типа цвет (Color)
CNot Integer H0009 9 Операции с переменными типа цвет (Color)
COr Integer H0006 6 Операции с переменными типа цвет (Color)
CXor Integer H0008 8 Операции с переменными типа цвет (Color)
Element Integer H0000 0 Запросы к компоненту сеть
Empty Integer H0000 0 Запросы компонента интерпретатор ответа
EmptyPrep Integer H0003 3 Запросы компонента предобработчик
False Logic H00    
FuncPrep Integer H0005 5 Запросы компонента предобработчик
InSignalMask Integer H0003 3 Запросы к компоненту сеть
InSignals Integer H0000 0 Запросы к компоненту сеть
Layer Integer H0001 1 Запросы к компоненту сеть
MainVisual Visible     Интерфейсные функции
Major Integer H0002 2 Запросы компонента интерпретатор ответа
mIntegerArray Integer H0002 2 Функции управления памятью
mLogicArray Integer H0001 1 Функции управления памятью
mLongArray Integer H0004 4 Функции управления памятью
ModPrep Integer H0004 4 Запросы компонента предобработчик
mRealArray Integer H0004 4 Функции управления памятью
Null Pointer H00000000 нет  
Ordered Integer H0002 2 Запросы компонента предобработчик
OutSignals Integer H0001 1 Запросы к компоненту сеть
Parameters Integer H0002 2 Запросы к компоненту сеть
ParamMask Integer H0004 4 Запросы к компоненту сеть
PositPrep Integer H0006 6 Запросы компонента предобработчик
tbAnswers Integer H0004 4 Язык описания задачника
tbCalcAnswers Integer H0006 6 Язык описания задачника
tbCalcReliability Integer H0007 7 Язык описания задачника
tbColor Integer H0001 1 Язык описания задачника
tbComment Integer H000A 10 Язык описания задачника
tbEstimation Integer H0009 9 Язык описания задачника
tbInput Integer H0002 2 Язык описания задачника
tbPrepared Integer H0003 3 Язык описания задачника
tbReliability Integer H0005 5 Язык описания задачника
tbWeight Integer H0008 8 Язык описания задачника
True Logic HFF 255 (-1)  
UnknownLong Integer H0000 0 Неопределенные значения
UnknownReal Real нет 1E-40 Неопределенные значения
UnOrdered Integer H0001 1 Запросы компонента предобработчик
UserType Integer HFFFF -1 Структурная единица, определенная пользователем.

Три предопределенные константы, приведенные в табл.11, не описываются ни в одном разделе данной работы. Это константы общего пользования. Их значение:

True – значение истина для присваивания переменным логического типа.

False – значение ложь для присваивания переменным логического типа.

Null – пустой указатель. Используется для сравнения или присваивания переменным всех типов указателей.

Интерфейсные функции

Часто при обучении и тестировании нейронных сетей возникает необходимость отображать на экран некоторую информацию. Например, число предъявлений примеров сети, максимальную оценку и т.п. Вряд ли разумно использовать язык описания компонентов нейрокомпьютера для описания интерфейса. Это противоречит требованию переносимости текста описания компонентов между разными платформами и операционными системами. Для облегчения создания интерфейса, с одной стороны, и обеспечения универсальности описания компонентов нейрокомпьютера, с другой, предложен набор интерфейсных функций. Поддержку этих функций несложно организовать в любой операционной среде и на любой платформе.

В основу набора интерфейсных функций положен принцип объектно-ориентированной машины потока событий. Примером таких систем может служить инструментальная библиотека объектов (классов) Turbo Vision фирмы Борланд, или оконный интерфейс Windows фирмы Майкрософт. Предлагаемый в данном разделе набор интерфейсных функций беднее любой из выше названных интерфейсных библиотек, но позволяет организовать достаточно красивый и удобный интерфейс.

Структура данных интерфейсных функций

Элементом данных в структуре интерфейса является отображаемый элемент. Каждый отображаемый элемент имеет свои координаты относительно начала владельца – отображаемого элемента, содержащего данный. Владельцем отображаемого элемента может являться одно из окон или диалогов или главный элемент. Главный отображаемый элемент является предопределенным и обозначается переменной MainVisual. В программах компонентов нейрокомпьютера не допускается изменение значения переменной MainVisual. Эту переменную стоит рассматривать как константу, однако, в отличие от всех остальных констант ее значение определяется не данным стандартом, а разработчиком библиотеки интерфейсных функций.

В данной работе не рассматривается способ реализации интерфейсных функций и не обсуждаются значения переменных типа Visible. По этому ставится единственное условие – переменные типа Visible могут изменять свои значения только при вызове интерфейсных функций или при присваивании им значений другой переменной того же типа.

Все отображаемые элементы создаются интерфейсными функциями, называющимися, так же как и сам отображаемый элемент. Интерфейсные функции создающие отображаемые элементы возвращают значения типа Visible. Если при вызове создающей отображаемый элемент функции элемент не был создан, то функция возвращает значение Null.

Соглашение о передаче значений отображаемым элементам

Отображаемые элементы могут быть связаны с обычными переменными. В следующих разделах описаны отображаемые элементы, для которых должна быть установлена такая связь. При изменении значения связанной переменной программным путем для отображения этого изменения должна быть вызвана функция Refresh, с переменной типа Visible данного элемента в качестве параметра. При связывании переменной и отображаемого элемента необходимо совпадение типа переменной с связываемым переменной этого отображаемого элемента.

Перечень отображаемых элементов

Название элемента: Window (окно).

Параметры при создании:

BeginX, BeginY – Координаты верхнего левого угла окна относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры окна.

ScrollX, ScrollY – Целочисленные параметры, задающие наличие у окна горизонтальной и вертикальной полосы прокрутки. Если значение параметра равно нулю, то соответствующая полоса прокрутки отсутствует, при любом другом значении параметра в окно включается соответствующая полоса прокрутки.

Text – Название окна.

Описание элемента. Элемент Window может являться владельцем любых других отображаемых элементов, кроме элементов типа Dialog. При вызове функции Refresh, с элементом типа Window в качестве параметра, обновляется изображение не только самого окна, но и всех отображаемых элементов, для которых это окно является владельцем. Для отображения созданного окна на экране необходимо вставить его (вызвать функцию Insert, с данным окном в качестве второго параметра.) в отображенное на экран окно, диалог или в отображаемый элемент MainVisible. Для того чтобы убрать окно с экрана, необходимо вызвать функцию Delete, с данным окном в качестве параметра. Для уничтожения окна необходимо вызвать функцию Erase, с данным окном в качестве параметра. При этом уничтожаются так же и все отображаемые элементы, для которых данное окно являлось владельцем.

Название элемента: Dialog (Диалог).

Параметры при создании:

BeginX, BeginY – Координаты верхнего левого угла окна диалога относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры окна диалога.

ScrollX, ScrollY – Целочисленные параметры, задающие наличие у окна диалога горизонтальной и вертикальной полосы прокрутки. Если значение параметра равно нулю, то соответствующая полоса прокрутки отсутствует, при любом другом значении параметра в окно диалога включается соответствующая полоса прокрутки.

Text – Название окна диалога.

Описание элемента. Элемент Dialog может являться владельцем любых других отображаемых элементов. Этот элемент является модальным, то есть во время работы диалога невозможен вызов меню, переход в другие окна и диалоги и т.д. Если одновременно активно несколько диалогов, то модальным является последний по порядку отображения на экране. При закрытии текущего диалога модальность переходит к предыдущему и т.д. При вызове функции Refresh, с элементом типа Dialog в качестве параметра, обновляется изображение не только самого окна диалога, но и всех отображаемых элементов, для которых этот диалог является владельцем. Для отображения созданного диалога на экране необходимо вставить его (вызвать функцию Insert, с данным диалогом в качестве второго параметра.) в отображаемый элемент MainVisible. С этого момента диалог становится модальным. Он остается модальным либо до вставки в MainVisible другого диалога, либо до закрытия диалога. Если модальность потеряна диалогом из-за запуска следующего диалога, то при закрытии последнего диалога статус модальности восстанавливается. Для того чтобы закрыть диалог, необходимо вызвать функцию Delete, с данным диалогом в качестве параметра. Для уничтожения диалога необходимо вызвать функцию Erase, с данным диалогом в качестве параметра. При этом уничтожаются так же и все отображаемые элементы, для которых данный диалог являлся владельцем.

Название элемента: Label (метка).

Параметры при создании:

BeginX, BeginY – Координаты верхнего левого угла метки относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры метки.

Text – текст метки.

Описание элемента. Элемент Label не может являться владельцем других отображаемых элементов. Этот элемент не связан с переменными. Как правило, он используется для организации отображения в окне или диалоге статической информации или в качестве подписи поля ввода. Если метка связана с полем ввода, то передача управления этой метке автоматически влечет за собой передачу управления связанному с ней полю. Для организации связи метки с полем необходимо вызвать функцию Link, передав ей в качестве первого параметра метку, а вторым параметром тот элемент, с которым необходимо установить связь. Связь может быть установлена только с одним элементом. При повторном вызове функции Link устанавливается связь с новым элементом, а связь с прежним элементом разрывается. Для включения метки в окно или диалог, необходимо вызвать функцию Insert, с окном или диалогом в качестве первого параметра и меткой в качестве второго параметра. Для уничтожения метки необходимо вызвать функцию Erase, с данной меткой в качестве параметра.

Название элемента: StringVisible (строковый элемент).

Параметры при создании:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Size – размер поля.

Описание элемента. Элемент StringVisible не может являться владельцем других отображаемых элементов. Этот элемент должен быть связан с переменной типа String. Для установления связи используется функция Data со строковым элементом в качестве первого параметра и адресом переменной в качестве второго параметра. Как правило, строковый элемент связывают с меткой. Для организации связи метки со строковым элементом необходимо вызвать функцию Link, передав ей в качестве первого параметра метку, а вторым параметром строковый элемент. Для включения строкового элемента в окно или диалог, необходимо вызвать функцию Insert, с окном или диалогом в качестве первого параметра и строковым элементом в качестве второго параметра. Для уничтожения строки необходимо вызвать функцию Erase, с данным строковым элементом в качестве параметра. Параметр Size задает максимальный размер вводимой строки в символах.

Название элемента: RealVisible (LongVisible) (числовой элемент).

Параметры при создании:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Min, Max – минимальное и максимальное допустимые значения.

Size – размер поля.

Описание элемента. Элементы RealVisible и LongVisible служат для ввода действительных и длинных целых чисел, соответственно. Любой такой элемент должен быть связан с переменной соответствующего типа (Real или Long) и не может являться владельцем других отображаемых элементов. Для установления связи используется функция Data с числовым элементом в качестве первого параметра и адресом переменной в качестве второго параметра. Как правило, числовой элемент связывают с меткой. Для организации связи метки с числовым элементом необходимо вызвать функцию Link, передав ей в качестве первого параметра метку, а вторым параметром числовой элемент. Для включения числового элемента в окно или диалог, необходимо вызвать функцию Insert, с окном или диалогом в качестве первого параметра и числовым элементом в качестве второго параметра. Для уничтожения числового элемента необходимо вызвать функцию Erase, с данным числовым элементом в качестве параметра.

Название элемента: RadioButtons (переключатели).

Параметры при создании:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Описание элемента. Элемент RadioButtons служит для задания значения параметрам, которые могут принимать только несколько значений (например, два значения – истина или ложь). Процедура создания элемента RadioButtons сложнее, чем для ранее рассмотренных процедур. Кроме вызова функции RadioButtons, создающей элемент, необходимо несколько раз вызвать функцию AddItem, с элементом RadioButtons в качестве первого аргумента и подписью переключателя в качестве второго аргумента. Элемент RadioButtons должен быть связан с переменной типа Long и не может являться владельцем других отображаемых элементов. Для установления связи используется функция Data с элементом RadioButtons в качестве первого параметра и адресом переменной в качестве второго параметра. Элемент RadioButtons интерпретирует данные, содержащиеся в переменной, следующим образом: первому флагу соответствует младший бит переменной, второму следующий по старшинству и т. д. Элемент не может включать более 32 флагов. Биты с номерами большими числа флагов очищаются (заменяются нулями). Как правило, элемент RadioButtons связывают с меткой. Для организации связи метки с элементом RadioButtons необходимо вызвать функцию Link, передав ей в качестве первого параметра метку, а вторым параметром элемент RadioButtons. Для включения элемента RadioButtons в окно или диалог, необходимо вызвать функцию Insert, с окном или диалогом в качестве первого параметра и элементом RadioButtons в качестве второго параметра. Для уничтожения элемента RadioButtons необходимо вызвать функцию Erase, с данным элементом RadioButtons в качестве параметра.

 

Название элемента: CheckBoxes (группа флагов).

Параметры при создании:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Описание элемента. Элемент CheckBoxes служит для задания значения параметрам, которые являются совокупностью битовых флагов. Процедура создания группы флагов аналогична созданию элемента RadioButtons. Кроме вызова функции CheckBoxes, создающей элемент, необходимо несколько раз вызвать функцию AddItem, с элементом CheckBoxes в качестве первого аргумента и названием флага в качестве второго аргумента. Элемент CheckBoxes должен быть связан с переменной типа Long и не может являться владельцем других отображаемых элементов. Для установления связи используется функция Data с элементом CheckBoxes в качестве первого параметра и адресом переменной в качестве второго параметра. Элемент CheckBoxes интерпретирует данные, содержащиеся в переменной, следующим образом: если значение переменной равно единице, то включен первый переключатель, если двум – то второй, трем – первые два и т. д. Если значение переменной меньше либо равно нулю или больше либо равно два в степени числа переключателей, то оно заменяется на единицу. Как правило, элемент CheckBoxes связывают с меткой. Для организации связи метки с элементом CheckBoxes необходимо вызвать функцию Link, передав ей в качестве первого параметра метку, а вторым параметром элемент CheckBoxes. Для включения группы флагов в окно или диалог, необходимо вызвать функцию Insert, с окном или диалогом в качестве первого параметра и элементом CheckBoxes в качестве второго параметра. Для уничтожения элемента CheckBoxes необходимо вызвать функцию Erase, с данным элементом CheckBoxes в качестве параметра.

Название элемента: Button(кнопка).

Параметры при создании:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Macro – Адрес функции, вызываемой при нажатии кнопки. В зависимости от реализации по этому адресу может лежать либо начало машинного кода функции, либо начало текста функции. В случае передачи текста функции первые восемь байт по переданному адресу содержат слово «Function».

Описание элемента. Кнопка служит для запуска макроса, который выполняет некоторые действия, являющиеся реакцией на нажатие кнопки. Кнопка не может быть связана с переменными и не может являться владельцем других отображаемых элементов. Для включения кнопки элемента в окно или диалог, необходимо вызвать функцию Insert, с окном или диалогом в качестве первого параметра и кнопкой в качестве второго параметра. Для уничтожения кнопки необходимо вызвать функцию Erase, с данной кнопкой в качестве параметра.

Перечень интерфейсных функций

В данном разделе дано описание всех интерфейсных функций. Приводится синтаксис описания на общем подмножестве языков описания компонентов нейрокомпьютера. Функции приведены в алфавитном порядке. Следует отметить, что, как и в языках описания всех компонентов нейрокомпьютера все аргументы передаются функциям по ссылке (передается не значение аргумента, а его адрес).

AddItem

Function AddItem( Elem : Visible; Text : String ) : Logic;

Описание аргументов:

Elem – Отображаемый элемент типа CheckBoxes или RadioButtons.

Text – Название переключателя или флага.

Описание функции:

Эта функция добавляет название переключателя (если первый аргумент типа RadioButtons) или флага (CheckBoxes) к списку элемента, передаваемого функции первым аргументом. Если первый элемент не является элементом типа CheckBoxes или RadioButtons, то функция возвращает значение ложь (False). В случае успешного завершения операции добавления в список функция возвращает значение истина (True). В противном случае возвращается значение ложь (False).

Button

Function Button( BeginX, BeginY, SizeX, SizeY : Long; Macro : PString ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Macro – Адрес функции, вызываемой при нажатии кнопки.

Описание функции:

Эта функция создает отображаемый элемент типа Button. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null.

CheckBoxes

Function CheckBoxes( BeginX, BeginY, SizeX, SizeY : Long ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Описание функции:

Эта функция создает отображаемый элемент типа CheckBoxes с пустым списком переключателей. Для добавления переключателей следует воспользоваться функцией AddItem. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null.

Data

Function Data( Element : Visible; Var Datum ) : Logic;

Описание аргументов:

Element – Отображаемый элемент, который связывается с переменной.

Datum – Адрес переменной.

Описание функции:

Эта функция связывает отображаемый элемент (Element) с перемнной Datum. Если элемент Element не допускает установления связи с переменной, то функция возвращает значение ложь (False). В противном случае она устанавливает связь между элементом и переменной и возвращает значение истина (True). Отметим, что функция не проверяет типа переменной. Если вместо адреса переменной типа длинное целое был дан адрес переменной действительного типа, то эта переменная будет интерпретироваться как длинное целое (см. разд. «Функции приведения типов»). Важно отметить, что производится приведение переменной, а не преобразование ее значения.

Delete

Function Delete( Owner, Element : Visible) : Logic;

Описание аргументов:

Owner – Отображаемый элемент типа окно или диалог, из которого происходит удаление.

Element – Удаляемый элемент.

Описание функции:

Эта функция удаляет отображаемый элемент (Element) из его владельца (Owner). Если элемент Owner не является окном или диалогом, или если он не является владельцем элемента Element, то функция возвращает значение ложь (False). В противном случае она удаляет элемент из владельца и возвращает значение истина (True). Отметим, что элемент удаляется, но не уничтожается. Если нет переменной, содержащей удаляемый элемент, то элемент «потеряется», то есть он станет недоступным из программы, но будет занимать память.

Dialog

Function Dialog( BeginX, BeginY, SizeX, SizeY, ScrollX, ScrollY : Long; Text : String ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

ScrollX, ScrollY – Целочисленные параметры, задающие наличие у окна горизонтальной и вертикальной полосы прокрутки. Если значение параметра равно нулю, то соответствующая полоса прокрутки отсутствует, при любом другом значении параметра в окно включается соответствующая полоса прокрутки.

Text – Название окна.

Описание функции:

Эта функция создает отображаемый элемент типа диалог. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null. После создания диалог является пустым.

Erase

Function Erase( Element : Visible ) : Logic;

Описание аргументов:

Element – Уничтожаемый элемент.

Описание функции:

Эта функция уничтожает отображаемый элемент (Element). Если аргумент Element является окном или диалогом, то уничтожаются так же все отображаемые элементы, для которых элемент Element является владельцем. Если операция завершена успешно, то функция возвращает значение истина (True). В противном случае – значение ложь (False). Если выполнение функции завершилось неуспешно (функция вернула значение ложь), то элемент может быть поврежден и его дальнейшее использование не гарантирует корректной работы.

Insert

Function Insert( Owner, Element : Visible) : Logic;

Описание аргументов:

Owner – Отображаемый элемент типа окно или диалог, в который производится вставка.

Element – Вставляемый элемент.

Описание функции:

Эта функция вставляет отображаемый элемент (Element) в элемент (Owner). Если элемент Owner не является окном или диалогом, или если Element является диалогом, то функция возвращает значение ложь (False). Такие же действия производятся, в случае, если аргумент Owner совпадает с MainVisible, а Element не является окном или диалогом. В противном случае она вставляет элемент в Owner и возвращает значение истина (True). Вставка окна или диалога в MainVisible вызывает отображение его на экране, а в случае, если вставляется диалог, то ему передается управление.

Label

Function Label( BeginX, BeginY, SizeX, SizeY : Long; Text : String ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Text – текст метки.

Описание функции:

Эта функция создает отображаемый элемент типа Label. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null.

Link

Function Link( Element, Labels : Visible) : Logic;

Описание аргументов:

Owner – Отображаемый элемент, связываемый с меткой.

Element – Отображаемый элемент – метка.

Описание функции:

Эта функция устанавливает связь между меткой Labels и отображаемым элементом Element. Если элемент Labels не является меткой, то функция возвращает значение ложь (False). В противном случае она устанавливает связь и возвращает значение истина (True).

LongVisible

Function LongVisible( BeginX, BeginY, SizeX, SizeY, Min, Max, Size: Long ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Min, Max – минимальное и максимальное допустимые значения.

Size – размер поля в символах.

Описание функции:

Эта функция создает отображаемый элемент типа LongVisible для редактирования и ввода значений типа Long. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null.

RadioButtons

Function RadioButtons( BeginX, BeginY, SizeX, SizeY : Long ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Описание функции:

Эта функция создает отображаемый элемент типа RadioButtons с пустым списком флагов. Для добавления переключателей следует воспользоваться функцией AddItem. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null.

RealVisible

Function RealVisible ( BeginX, BeginY, SizeX, SizeY : Long; Min, Max : Real; Size: Long ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Min, Max – минимальное и максимальное допустимые значения.

Size – размер поля в символах.

Описание функции:

Эта функция создает отображаемый элемент типа RealVisible для редактирования и ввода значений типа Real. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null.

Refresh

Function Refresh( Element : Visible ) : Logic;

Описание аргументов:

Element – Отображаемый элемент.

Описание функции:

Эта функция обновляет изображение элемента Element на экране. Если операция прошла успешно, то функция возвращает значение истина (True). В противном случае она возвращает значение ложь (False).

StringVisible

Function StringVisible ( BeginX, BeginY, SizeX, SizeY, Size: Long ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

Size – размер поля в символах.

Описание функции:

Эта функция создает отображаемый элемент типа StringVisible для редактирования и ввода символьных строк. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null.

Window

Function Window( BeginX, BeginY, SizeX, SizeY, ScrollX, ScrollY : Long; Text : String ) : Visible;

Описание аргументов:

BeginX, BeginY – Координаты верхнего левого угла элемента относительно владельца.

SizeX, SizeY – Горизонтальный и вертикальный размеры элемента.

ScrollX, ScrollY – Целочисленные параметры, задающие наличие у окна горизонтальной и вертикальной полосы прокрутки. Если значение параметра равно нулю, то соответствующая полоса прокрутки отсутствует, при любом другом значении параметра в окно включается соответствующая полоса прокрутки.

Text – Название окна.

Описание функции:

Эта функция создает отображаемый элемент типа окно. Если создание прошло успешно, то возвращается значение этого элемента (типы значений не оговариваются стандартом, но, как правило, это адрес соответствующей структуры). Если создание элемента завершилось не удачно, то возвращается значение Null. После создания окно является пустым.

Строковые функции

В этом разделе описан набор функций для работы со строками, которые могут использоваться в языках описания всех компонентов нейрокомпьютера.

Function SubStr( S : String; Origin, Leng : Integer ) : String;

Описание аргументов

S – строка, из которой выделяется фрагмент.

Origin – начальная позиция выделяемого фрагмента в строке S

Leng – длина выделяемого фрагмента.

Выделяет из строки S фрагмент, начинающийся с позиции Origin и длиной Leng символов. Если строка короче чем Origin, то результатом является пустая строка. Если строка длиннее чем Origin символов, но короче чем Origin+Leng символов, то результатом является фрагмент строки S с символа Origin и до конца строки S.

Function Pos( S1, S2 : String ) : Integer

Описание аргументов

S1 – строка, в которой ищется вхождение строки S2.

S2 – строка, вхождение которой ищется.

Функция Pos возвращает номер первого символа в строке S1, начиная с которого, в строке S1 полностью содержится строка S2. Если строка S2 ни разу не встретилась в строке S1, то результат равен нулю.

Function Len( S : String ) : Integer

Описание аргументов

S – строка, длина которой вычисляется.

Функция Len возвращает длину (число символов) строки S

Описание языка описания компонентов

В табл. 12 приведен список ключевых слов, общих для всех языков описания компонентов нейрокомпьютера. Кроме того, к ключевым словам относятся типы данных, приведенные в табл. 1; обозначения операций, приведенные в табл. 3, 7, 8, 9, 10; названия функций преобразования (табл. 5) и приведения типов (табл. 6); идентификаторы предопределенных констант, приведенные в табл. 11; имена интерфейсных функций, приведенных в разделе «Перечень интерфейсных функций»; имена элементарных функций, приведенных в табл.13; обозначения строковых функций, приведенных в разделе «Строковые функции» и обозначения функций управления памятью из раздела «Функции управления памятью».

Таблица 12.

Ключевые слова, общие для всех языков описания компонент нейрокомпьютера.

Ключевое слово Краткое описание
Begin Начало описания тела процедуры, или операторных скобок.
By Часть оператора цикла с шагом. Предшествует шагу цикла.
Do Завершающая часть операторов цикла.
Else Часть условного оператора. Предшествует оператору, выполняемому, если условие ложно.
End Конец описания тела процедуры или операторных скобок.
For Заголовок оператора цикла с шагом.
Function Заголовок описания функции.
Global Начло блока описания глобальных переменных.
GoTo Начало оператора перехода.
If Начало условного оператора.
Include Предшествует имени файла, целиком вставляемого в это место описания.
Label Начало описания меток
Name Предшествует имени статической переменной.
SetParameters Признак раздела установления значений параметров.
Static Начло блока описания статических переменных.
Then Часть условного оператора. Предшествует оператору, выполняемому, если условие истинно.
To Часть оператора цикла с шагом. Предшествует верхней границе цикла.
Var Начло блока описания переменных.
While Заголовок оператора цикла по условию.

Таблица 13

Элементарные функции, допустимые в языках описания компонент нейрокомпьютера

Имя Значение Имя Значение
Sin Синус Cos Косинус
Tan Тангенс Atan Арктангенс
Sh Гиперболический синус Ch Гиперболический косинус
Th Гиперболический тангенс Lg Логарифм двоичный
Ln Логарифм натуральный Exp Экспонента
Sqrt Квадратный корень Sqr Квадрат
Abs Абсолюеное значение Sign Знак аргумента (0 – минус)

Передача аргументов функциям

Во всех языках описания компонентов все параметры передаются по ссылке (передается не значение аргумента, а его адрес). Если в качестве фактического аргумента указано выражение, то значение выражения помещается интерпретатором (или компилятором) во временную переменную, имеющую тип, совпадающий с типом формального аргумента, а адрес временной переменной передается в качестве фактического аргумента.

Имена структурных единиц компонентов

Компоненты предобработчик, сеть, оценка и интерпретатор ответа имеют иерархическую структуру. Часть запросов может быть адресована не всему компоненту, а его структурной единице любого уровня. Для точного указания адресата запроса используется полное имя структурной единицы, которое строится по следующему правилу:

  1. Имя компонента является полным именем компонента.
  1. Полное имя младшей структурной единицы строится путем добавления справа к имени старшей структурной единицы точки, псевдонима младшей структурной единицы и номера экземпляра младшей структурной единицы, если младших структурных единиц с таким псевдонимом несколько.

Иногда при построении описания компонента требуется однозначное имя структурной единицы. В качестве однозначного имени можно использовать полное имя, но такой подход лишает возможности вставлять подготовленные структурные единицы в структуры более высокого уровня. Для этого вводится понятие однозначного имени структурной единицы: в описании структурной единицы A однозначным именем структурной единицы B, являющейся частью структурной единицы A, является полное имя структурной единицы B, из которого исключено полное имя структурной единицы A.

Способ описания синтаксических конструкций

Для описания синтаксиса языков описаний компонентов используется расширенная Бэкусова нормальная форма. Описание синтаксиса языка с помощью БНФ состоит в расшифровке понятий от более сложных к более простым. Каждое предложение БНФ состоит из двух частей, разделенных символами «::=» (два двоеточия, за которыми следует знак равенства). Наиболее подходящим названием для этого разделителя является слово «является» в отличие от «равно» или «присвоить» в языках программирования. Слева от разделителя находится объясняемое понятие, справа – конструкция разъясняющая это понятие. Например, предложение

<Имя переменной> ::= <Идентификатор>

означает, что объясняемое понятие – <Имя переменной> является идентификатором. Заметим, что порядок предложений в БНФ описания синтаксиса языка не имеет значения. Однако традиционно сложилось так, что БНФ начинают с наиболее сложных понятий.

При описании синтаксиса языка с помощью БНФ используются следующие понятия и обозначения.

Нетерминальным символом называется понятие, которое должно быть раскрыто в пределах данной БНФ. Нетерминальным символом является произвольный набор символов, заключенный в угловые скобки, например <Имя>. Нетерминальный символ раскрыт, если в пределах БНФ встретилось предложение, в котором этот нетерминальный символ стоит в левой части.

Терминальным символом называется понятие, которое не требует раскрытия. Примерами терминальных символов являются буквы, цифры и ключевые слова описываемого языка. Терминальные символы не заключаются в угловые скобки и набраны курсивом, например Имя.

Подмножеством терминальных символов является набор ключевых слов языка. Для удобства ключевые слова набраны полужирным шрифтом, например, Имя.

В прямых квадратных скобках приводятся необязательные части синтаксических конструкций. Например предложение

<Целое число> ::= [–] <Положительное целое число>

означает, что целым числом является положительное целое число (знак минус, стоящий в квадратных скобках, опущен как необязательный) или положительное целое число, перед которым стоит знак минус (знак минус, стоящий в квадратных скобках, задействован). Отметим, что квадратные скобки, набранные курсивом, являются терминальными символами.

Набор из нескольких синтаксических конструкций, разделенных символом «|» и заключенных в прямые фигурные скобки задают конструкцию выбора одной и только одной из перечисленных в фигурных скобках конструкций. Например, предложение

<Буква> ::= { A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z}

означает, что понятие буква является одной из заглавных букв латинского алфавита. Отметим, что фигурные скобки, набранные курсивом, являются терминальными символами.

В целях сокращения описания в тех случаях, когда БНФ описание понятия сложно, а неформальное описание просто и однозначно, в БНФ описание включаются фрагменты неформального описания таких понятий.

Кроме того в данную модификацию БНФ включены нетерминальные символы с параметрами. В теле нетерминального символа параметры набраны полужирным курсивом. В качестве примера приведем набор предложений, описывающих формальные аргументы:

<Список формальных аргументов> ::= <Формальный аргумент> [; <Список формальных аргументов>]

<Формальный аргумент> ::= <Список имен аргументов> : <Скалярный тип>

<Список имен аргументов> ::= <Имя аргумента> [,<Список имен аргументов>]

<Имя аргумента> ::= <Идентификатор>

<Аргумент типа Тип> – одно из следующих понятий:

имя аргумента, который при описании формальных аргументов имел тип Тип

имя элемента аргумента-массива, если элементы массива имеют тип Тип

результат приведения произвольного аргумента или элемента аргумента-массива к типу Тип.

В этом фрагменте содержится предложение, раскрывающее понятие <Аргумент типа Тип>, являющееся нетерминальным символом с параметром. Из последнего предложения легко понять, что представляет собой понятие <Аргумент типа Тип>. Для описания этого понятия в соответствии с требованиями стандартной БНФ пришлось бы описывать отдельно следующие понятия: <Аргумент типа Long>, <Аргумент типа Real>, <Аргумент типа Integer>, <Аргумент типа Color>, <Аргумент типа Logic>, <Аргумент типа String>, <Аргумент типа PRealArray>, <Аргумент типа PIntegerArray>, <Аргумент типа PLongArray>, <Аргумент типа PLogicArray>, <Аргумент типа PString>, <Аргумент типа Visual>, <Аргумент типа Pointer>, <Аргумент типа FuncType>. Кроме того, пришлось бы отказаться от простой и понятной конструкции описания формальных аргументов. Ниже приведена часть конструкции описания формальных аргументов, которую пришлось бы включить в БНФ. В данном фрагменте приведена расшифровка только одного понятия – <Аргумент типа Long>. Остальные нераскрытые понятия описываются аналогично. Понятия <Идентификатор> и <Номер элемента> считаются раскрытыми ранее.

<Список формальных аргументов> ::= <Формальный аргумент> [; <Список формальных аргументов>]

<Формальный аргумент> ::= {<Формальный аргумент типа Long> | <Формальный аргумент типа Real> | <Формальный аргумент типа Integer> | <Формальный аргумент типа Color> | <Формальный аргумент типа Logic> | <Формальный аргумент типа String> | <Формальный аргумент типа PRealArray> | <Формальный аргумент типа PIntegerArray> | <Формальный аргумент типа PLongArray> | <Формальный аргумент типа PLogicArray> | <Формальный аргумент типа PString> | <Формальный аргумент типа Visual> | <Формальный аргумент типа Pointer> | <Формальный аргумент типа FuncType>}

<Формальный аргумент типа Long> ::= <Список имен аргументов типа Long> : Long;

<Список имен аргументов типа Long> ::= <Имя аргумента типа Long> [,<Список имен аргументов типа Long>]

<Имя аргумента типа Long> ::= <Идентификатор>

<Аргумент типа Long> ::= {<Имя аргумента типа Long> | <Имя аргумента типа PLongArray>^[<Номер элемента>] | TLong(<Имя произвольного аргумента>)}

<Имя произвольного аргумента> ::= <Имя аргумента типа Long>, <Имя аргумента типа Real>, <Имя аргумента типа Integer>, <Имя аргумента типа Color>, <Имя аргумента типа Logic>, <Имя аргумента типа String>, <Имя аргумента типа PRealArray>, <Имя аргумента типа PIntegerArray>, <Имя аргумента типа PLongArray>, <Имя аргумента типа PLogicArray>, <Имя аргумента типа PString>, <Имя аргумента типа Visual>, <Имя аргумента типа Pointer>, <Имя аргумента типа FuncType>

Третье четвертое и пятое предложения данного фрагмента пришлось бы повторить для каждого из остальных тринадцати типов аргументов. Поскольку приведенные в книге БНФ описания языков призваны задать и объяснить синтаксис языка, а не служить исходным кодом компилятора компиляторов, автор счел возможным отступить от канонов БНФ, тем более, что для профессионала в области языков программирования не составит большого труда заменить неформальные конструкции на точные формальные фрагменты.

Описание общих синтаксических конструкций

В данном разделе приведено описание общего подмножества языков описания компонентов. В некоторых случаях, когда БНФ описание понятия сложно, а неформальное описание просто и однозначно, в БНФ описание включаются фрагменты неформального описания таких понятий.

Список синтаксических конструкций общего назначения:

<Идентификатор> ::= <Буква> [<Символьная строка>]

<Буква> ::= {a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z}

<Символьная строка> ::= {<Буква> | <Цифра> | _ } [<Символьная стока>]

<Цифра> ::= {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}

<Число> ::= {<Целое число> | <Действительное число>}

<Целое число> ::= [–] <Положительное целое число>

<Положительное целое число> ::= <Цифра> [<Положительное целое число>]

<Действительное число> ::= <Целое число>[.<Положительное целое число>][e<Целое число>]

<Целочисленная константа> ::= {<Предопределенная константа типа Integer> | < Предопределенная константа типа Long> | <Целое число>}

<Цветовая константа> ::= H <Шестнадцатеричная цифра> <Шестнадцатеричная цифра> <Шестнадцатеричная цифра> <Шестнадцатеричная цифра>

<Шестнадцатеричная цифра> ::= {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F }

<Строковая константа> ::= “<Строка произвольных символов>”

<Логическая константа> ::= {True | False}

<Строка произвольных символов> – Последовательность произвольных символов из набора ANSI. В этой последовательности допускаются символы национальных алфавитов. При необходиости включить в эту конструкцию символ кавычек, он должен быть удвоен.

<Скалярный тип> ::= {Long | Real | Integer | Color | Logic | String | PRealArray | PIntegerArray | PLongArray | PLogicArray | PString | Visual | Pointer | FuncType}

<Тип массива> ::= { RealArray | IntegerArray | LongArray | LogicArray}

<Константа типа Тип> – константа имеющая тип Тип.

Список синтаксических конструкций для формальных аргументов:

<Список формальных аргументов> ::= <Формальный аргумент> [; <Список формальных аргументов>]

<Формальный аргумент> ::= <Список имен аргументов> : <Скалярный тип>

<Список имен аргументов> ::= <Имя аргумента> [,<Список имен аргументов>]

<Имя аргумента> ::= <Идентификатор>

<Аргумент типа Тип> – одно из следующих понятий:

имя аргумента, который при описании формальных аргументов имел тип Тип

имя элемента аргумента-массива, если элементы массива имеют тип Тип

результат приведения произвольного аргумента или элемента аргумента-массива к типу Тип.

Синтаксические конструкции описания переменных:

<Описание переменных> ::= Var <Список описаний однотипных переменных>

<Список описаний однотипных переменных> ::= <Тип переменной> <Список переменных>; [<Список описаний однотипных переменных>]

<Список переменных> ::= <Имя переменной> [, <Список переменных>]

<Имя переменной> ::= <Идентификатор>

<Тип переменной> ::= {<Скалярный тип> | <Тип массива>[<Целочисленное константное выражение>]}

<Переменная типа Тип> – одно из следующих понятий:

имя переменной, которая при описании переменных имела тип Тип

имя элемента массива, если элементы массива имеют тип Тип

результат приведения произвольной переменной или элемента массива к типу Тип.

Синтаксическая конструкция описания глобальных переменных (доступна только в языках описания компонентов учитель и контрастер):

<Описание глобальных переменных> ::= Global <Список описаний однотипных переменных>

Синтаксические конструкции описания статических переменных

Статические переменные, как правило, служат для описания параметров компонентов нейрокомпьютера. Использование в именах переменных только символов латинского алфавита и цифр делает идентификаторы универсальными, но неудобными для всех пользователей, кроме англо-говорящих. Для удобства всех остальных пользователей в описании статических переменных предусмотрена возможность использовать дополнительные имена для статических переменных. Однако эти имена служат только для построения интерфейса и не могут быть использованы в описании тела соответствующего компонента. Кроме того, статической переменной можно при описании задать значение по умолчанию.

<Описание статических переменных> ::= Static <Список описаний статических переменных>

<Список описаний статических переменных> ::= <Описание статической переменной>; [<Список описаний статических переменных>]

<Описание статической переменной> ::= <Тип переменной> <Имя переменной> [Name <Имя статической переменной>] [Default <Значение по умолчанию>]

<Имя статической переменной> ::= <Строковая константа>

<Значение по умолчанию> ::= <Константное выражение типа <Тип переменной>>

Синтаксические конструкции описания функций

<Описание функций> ::= <Описание функции> [<Описание функций>]

<Описание функции> ::= <Заголовок функции> <Описание переменных> <Описание меток> <Тело функции>

<Заголовок функции> ::= Function <Имя функции>[(<Список формальных аргументов>)] : <Скалярный тип>;

<Описание меток> ::= Label <Список меток>;

<Список меток> ::= <Имя метки> [, <Список меток>]

<Имя метки> ::= <Идентификатор>

<Тело функции> ::= Begin <Составной оператор> End;

<Составной оператор> ::= [<Имя метки>:] <Оператор> [; <Составной оператор>]

<Оператор> ::= {<Оператор присваивания> | <Оператор ветвления> | <Оператор цикла> | <Оператор перехода> | <Операторные скобки>}

<Оператор присваивания> ::= <Допустимое имя переменной> = <Выражение>

<Оператор ветвления> ::= If <Логическое выражение> Then <Оператор> [Else <Оператор>]

<Оператор цикла> ::= { <Цикл For> | <Цикл While> }

<Цикл For> ::= For <Имя переменной> = <Целочисленное выражение> To <Целочисленное выражение> [By <Целочисленное выражение>] Do <Оператор>

<Цикл While> ::= While <Логическое выражение> Do <Оператор>

<Оператор перехода> ::= GoTo <Имя метки>

<Операторные скобки> ::= Begin <Составной оператор> End

<Функция типа Тип> – функция, возвращающая величину типа Тип.

<Допустимое имя переменной> – допустимой переменной являются все переменные, описанные в данной функции или в данном процедурном блоке, глобальные переменные данного компонента. Для возвращения значения функции, в левой части оператора присваивания должно стоять имя функции.

Синтаксические конструкции описания выражений:

<Выражение> ::= { <Выражение типа Long> | <Выражение типа Real> | <Выражение типа Integer> | <Выражение типа Color> | <Выражение типа Logic> | <Выражение типа String> | <Выражение типа Pointer>}

<Целочисленное выражение> ::= { <Выражение типа Long> | <Выражение типа Integer>}

<Выражение типа Тип> ::= [<Префиксная операция типа Тип>] <Операнд типа Тип> [<Операция типа Тип> <Операнд типа Тип>]

<Операция типа Long> ::= {+ | | * | Div | Mod | And | Or | Xor}

<Операция типа Real>::= {+ | | * | / | RMod }

<Операция типа Integer> ::= {+ | | * | Div | Mod | And | Or | Xor}

<Операция типа Color> ::= {COr | CAnd | CXor}

<Операция типа Logic> ::= {And | Or | Xor}

<Операция типа String> ::= +

<Префиксная операция типа Long> ::= { | Not }

<Префиксная операция типа Real>::=

<Префиксная операция типа Integer> ::= { | Not }

<Префиксная операция типа Color> ::= CNot

<Префиксная операция типа Logic> ::= Not

<Операнд типа Logic> ::= ::= {<Результат сравнения> | <Выражение типа Logic> | (<Выражение типа Logic>) | <Константа типа Logic> | <Переменная типа Logic> | <Аргумент типа Logic> | <Вызов функции типа Logic>}

<Результат сравнения типов Long, Integer, Real> ::= (<Выражение типа Long, Integer, Real> {> | < | >= | <= | = | <>} <Выражение типа Long, Integer, Real> )

<Результат сравнения типа Color> ::= (<Выражение типа Color> {CEqual | CIn | CInclude | CExclude | CIntersect} <Выражение типа Color> )

<Результат сравнения типа String> ::= (<Выражение типа String> {= | <>} <Выражение типа String> )

<Операнд типа Тип> ::= {<Выражение типа Тип> | (<Выражение типа Тип>) | <Константа типа Тип> | <Переменная типа Тип> | <Аргумент типа Тип> | <Вызов функции типа Тип>}

<Вызов функции типа Тип> ::= <Имя функции типа Тип> [(<Список фактических аргументов>)]

<Список фактических аргументов> ::= <Выражение> [,<Список фактических аргументов>]

<Константное выражение типа Тип> – <Выражение типа Тип> в операндах которого не могут фигурировать переменные и функции, описанные пользователем.

<Числовое выражение> ::= { <Выражение типа Long> | <Выражение типа Real> | <Выражение типа Integer>}

Синтаксические конструкции задания значений статическим переменным

Эта конструкция служит для задания значений параметрам (статическим переменным) компонентов. Для компонента сеть она может встречаться не только при описании главной сети, но и при описании любой составной подсети. В специальных выражениях типа Тип могут участвовать только стандартные функции и аргументы той структурной единицы, в которой находится блок задания значений статическим переменным. При этом специальное выражение, задающее значение параметра должно иметь тип, совместимый с типом статической переменной, которой присваивается это значение.

<Установление параметров Структурной единицы> ::= <Однозначное имя Структурной единицы> [[[<Переменная цикла>:] <Начальный номер> [..<Конечный номер> [:<Шаг>] ]]] SetParameters <Список значений параметров>

<Переменная цикла> ::= <Идентификатор>

<Начальный номер> ::= <Константное выражение типа Long>

<Конечный номер> ::= <Константное выражение типа Long>

<Шаг> ::= <Константное выражение типа Long>

<Список значений параметров> ::= <Значение параметра> [,<Список значений параметров>]

<Значение параметра> ::= <Специальное выражение типа Тип>

<Специальное выражение типа Тип> ::= [<Префиксная операция типа Тип>] <Специальный операнд типа Тип> [<Операция типа Тип> <Специальный операнд типа Тип>]

<Специальный операнд типа Тип > ::= {<Специальное выражение типа Тип > | <Константа типа Тип> | <Переменная цикла> | (<Специальное выражение типа Тип > | <Аргумент типа Тип> | <Вызов функции типа Тип>)>

Синтаксические конструкции описания распределения сигналов или параметров:

Данная конструкция имеет четыре аргумента, имеющих следующий смысл:

Данное – сигнал или параметр.

Объект – предобработчик, интерпретатор, оценка, сеть.

Подобъект – частный предобработчик, частный интерпретатор, частная оценка, подсеть.

<Идентификатор данных> – одно из ключевых слов Signals, Parameters, Data, InSignals, OutSignals.

<Описание распределения Данных, Объекта, Подобъекта, <Идентификатор данных>> ::= Connections <Описание групп соответствий Данных>

<Описание групп соответствий Данных> ::= <Описание группы соответствий Данных> [;<Описание групп соответствий Данных>]

<Описание группы соответствий Данных> ::= <Блок сигналов Подобъекта> <=> {<Блок сигналов Объекта> | <Блок сигналов Подобъекта>}

<Блок сигналов Подобъекта> ::= <Описатель сигналов Подобъекта> [;<Блок сигналов Подобъекта>]

<Описатель сигналов Подобъекта> ::= { For <Переменная цикла> = <Начальный номер> To <Конечный номер> [Step <Шаг>] Do <Блок сигналов Подобъекта> End | <Список Данных Подобъекта>}

<Переменная цикла> ::= <Идентификатор>

<Список Данных Подобъекта> ::= <Данное Подобъекта>[; <Список Данных Подобъекта>]

<Данное Подобъекта> ::= <Псевдоним>[[<Номер экземпляра>]].<Идентификатор данных> [[<Номер Данного>]]

<Номер экземпляра> ::= {<Специальное выражение типа Long> | [+:]<Начальный номер> [..<Конечный номер> [:<Шаг>]]}

<Номер Данного> {<Специальное выражение типа Long> | [+:]<Начальный номер> [..<Конечный номер> [:<Шаг>]]}

<Блок Данных Объекта> ::= <Описатель Данных Объекта> [; <Блок Данных Объекта>]

<Описатель Данных Объекта> ::= { For <Переменная цикла> = <Начальный номер> To <Конечный номер> [Step <Шаг>] Do <Блок Данных Объекта> End | <Список Данных Объекта> }

<Список Данных Объекта> ::= <Данное Объекта>[; <Список Данных Объекта>]

<Данное Объекта> ::= <Идентификатор данных> [[<Номер Данного>]]

Комментарии

Для понятности описаний компонентов в них необходимо включать комментарии. Комментарием является любая строка (или несколько строк) символов, заключенных в фигурные скобки. Комментарий может находиться в любом месте описания компонента. При интерпретации или компиляции описания комментарии игнорируются (исключаются из текста).

Область действия переменных

Все идентификаторы состоят из произвольных комбинаций латинских букв, цифр и подчерков. Первым символом имени обязательно является буква. Использование букв только латинского алфавита связано с тем, что коды, используемые большинством компьютеров, имеют одинаковую кодировку для букв латинского алфавита, тогда как для букв национальных алфавитов других стран кодировка различна не только от компьютера к компьютеру но и от одной операционной системы к другой.

Заглавные и прописные буквы не различаются ни в именах, ни в ключевых словах.

Языки описания некоторых компонентов позволяют описывать глобальные переменные. Эти переменные доступны во всех функциях и процедурных блоках данного компонента. Функциям и процедурным блокам других компонентов эти переменные недоступны. Все остальные переменные (описанные в блоках Var и Static) являются локальными и доступны только в пределах той функции или процедурного блока, в котором они описаны. Статические переменные сохраняют свое значение между вызовами функций или процедурных блоков, тогда как переменные, описанные в блоках Var не сохраняют. В некоторых компонентах определены стандартные переменные и массивы (см. например описание языка описания нейронных сетей). В таких разделах область доступности предопределенных переменных оговаривается отдельно.

Переменная Error является глобальной для всех компонентов. Глобальной является также переменная ErrorManager. Однако не рекомендуется использование этих переменных путем прямого обращения к ним. Для получения значения переменной Error служит запрос GetError, исполняемый макрокомпонентом нейрокомпьютер.

Основные операторы

Оператор присваивания состоит из двух частей, разделенных знаком “=“. В левой части оператора присваивания могут участвовать имена любых переменных. В выражении, стоящем в правой части оператора присваивания могут участвовать любые переменные, аргументы процедурного блока и константы. В случае несоответствия типа выражения в правой части и типа переменной в левой части оператора присваивания производится приведение типа. Все выражения вычисляются слева на право с учетом старшинства операций.

Оператор ветвления. Оператор ветвления состоит из трех частей, каждая из которых начинается соответствующим ключевым словом. Первая часть – условие, начинается с ключевого слова If и содержит логическое выражение. В зависимости от значения вычисленного логического выражения выполняется Then часть (истина) или Else часть (ложь). Третья (Else) часть оператора может быть опущена. Каждая из выполняемых частей состоит из ключевого слова и оператора. При необходимости выполнить несколько операторов, необходимо использовать операторные скобки Begin End.

Цикл For имеет следующий вид:

For Переменная_цикла = Начальное_значение To Конечное_значение [By Шаг] Do <Оператор>

Переменная цикла должна быть одного из целочисленных типов. В ходе выполнения оператора она пробегает значения от Начальное_значение до Конечное_значение с шагом Шаг. Если описание шага опущено, то шаг равен единице. При каждом значении переменной цикла из диапазона выполняется оператор, являющийся телом цикла. Если в теле цикла необходимо выполнить несколько операторов, то необходимо воспользоваться операторными скобками. Допускается любое число вложенных циклов. Выполнение цикла в зависимости от соотношения между значениями Начальное_значение, Конечное_значение и Шаг приведено в табл. 14.

Таблица 14.

Способ выполнения цикла в зависимости от значений параметров цикла.

Конечное значение Шаг Способ выполнения
>Начального значения >0 Цикл выполняется пока переменная цикла £ Конечного значения
<Начального значения >0 Тело цикла не выполняется
=Начальному значению ¹0 Тело цикла выполняется один раз
>Начального значения <0 Тело цикла не выполняется
<Начального значения <0 Цикл выполняется пока переменная цикла ³ Конечного значения
Любое =0 Тело цикла не выполняется

Цикл While. Тело цикла выполняется до тех пор, пока верно логическое выражение. Проверка истинности логического выражения производится перед выполнением тела цикла. Если тело цикла должно содержать более одного оператора, то необходимо использовать операторные скобки.

Описание распределения сигналов

Раздел описания распределения сигналов начинается с ключевого слова Connections. За ключевым словом Connections следует одна или несколько групп соответствий. Каждая группа соответствий состоит из правой и левой частей, разделенных символами «<=>« и описывает соответствие имен сигналов (параметров) различных структурных единиц. Каждая часть группы соответствий представляет собой список сигналов (параметров) или интервалов сигналов (параметров), разделенных между собой символом «;». Указанные в левой и правой частях сигналы (параметры) отождествляются. Если при указании сигнала (параметра) не указано имя подобъекта, то это сигнал (параметр) описываемого объекта. Использование интервала сигналов (параметров) в правой или левой части группы соответствий равносильно перечислению сигналов (параметров), с номерами, входящими в интервал, начиная с начального номера c шагом, указанным после символа «:». Если шаг не указан, то он полагается равным единице. Число сигналов в правой и левой частях группы соответствий должно совпадать. Если интервал пуст (например [2..1:1]), то описываемая им группа сигналов считается отсутствующей и пропускается. При использовании в описании соответствий явных циклов, во всех выражениях внутри цикла возможно использование переменной цикла. При этом подразумевается следующий порядок перечисления: Сначала изменяется номер в самом правом интервале, далее во втором справа, и т.д. В последнюю очередь изменяются значения переменных цикла явных циклов в порядке их вложенности (переменная самого внутреннего цикла меняется первой и т.д.). Рассмотрим следующий пример описания группы соответствий блока, содержащего две сети Net с 3 входами каждая. Ниже приведено две различных структуры связей по несколько эквивалентных вариантов описания.

Случай 1. Естественный порядок связей.

Вариант 1.

InSignals[1] <=> Net[1].InSignals[1]

InSignals[2] <=> Net[1].InSignals[2]

InSignals[3] <=> Net[1].InSignals[3]

InSignals[4] <=> Net[2].InSignals[1]

InSignals[5] <=> Net[2].InSignals[2]

InSignals[6] <=> Net[2].InSignals[3]

Вариант 2.

InSignals[1..6] <=> Net[1..2].InSignals[1..3]

Вариант 3.

InSignals[1]; InSignals[2]; InSignals[3]; InSignals[4]; InSignals[5]; InSignals[6] <=>

For I=1 To 3 Do For J=1 To 2 Do Net[J].InSignals[I] End End

Случай 2. Другой порядок связей.

Вариант 1.

InSignals[1] <=> Net[2].InSignals[3]

InSignals[2] <=> Net[1].InSignals[3]

InSignals[3] <=> Net[2].InSignals[2]

InSignals[4] <=> Net[1].InSignals[2]

InSignals[5] <=> Net[2].InSignals[1]

InSignals[6] <=> Net[1].InSignals[1]

Вариант 2.

InSignals[1..6] <=> For I=3 To 1 Step -1 Do Net[2..1:-1].InSignals[I] End

Вариант 3.

InSignals[6..1:-2]; InSignals[5..1:-2]<=>

For I=1 To 3 Do For J=1 To 2 Do Net[J].InSignals[I] End End

Функции управления памятью

Для создания массивов и освобождения занимаемой ими памяти используются следующие функции:

Создание массива.

Function NewArray( Type : Integer; Size : Long ) : PRealArray;

Таблица 15.
Предопределенные константы типов элементов массивов
Идентификатор Значение Описание
mRealArray 4 Размер элемента – 4 байта
mIntegerArray 2 Размер элемента – 2 байта
mLongArray 4 Размер элемента – 4 байта
mLogicArray 1 Размер элемента – 1 байт

Описание аргументов:

Type – задает размер элемента массива и является одной из предопределенных констант, приведенных в табл. 15.

Size – число элементов в массиве.

Описание исполнения.

  1. Если аргумент Type не совпадает ни с одной из предопределенных констант, приведенных в табл. 15, то возвращается значение Null, исполнение функции завершается.
  1. Создается массив, занимающий Size*Type+4 байта.
  1. Адрес массива возвращается как результат.

Освобождение массива.

Function FreeArray( Type : Integer; Array : PRealArray ) : Logic;

Описание аргументов:

Type – задает размер элемента массива и является одной из предопределенных констант, приведенных в табл. 15.

Array – адрес массива. Память, занимаемая этим массивом, должна быть освобождена.

Описание исполнения.

  1. Если аргумент Type не совпадает ни с одной из предопределенных констант, приведенных в табл. 15, то возвращается значение False, исполнение функции завершается.
  1. Освобождается память размером TReal(Array[0])*Type+4 байта.
  1. Аргументу Array присваивается значение Null

Пересоздание массива.

Function ReCreateArray( Type : Integer; Array : PRealArray; Size : Long ) : Logic;

Описание аргументов:

Type – задает размер элемента массива и является одной из предопределенных констант, приведенных в табл. 15.

Array – адрес массива.

Size – число элементов в массиве.

Описание исполнения.

  1. Если аргумент Type не совпадает ни с одной из предопределенных констант, приведенных в табл. 15, то возвращается значение False, исполнение функции завершается.
  1. Если аргумент Array не равен Null, и TReal(Array[0]) равен Size, то возвращается значение True, выполнение функции завершается.
  1. Если аргумент Array не равен Null, и TReal(Array[0]) не равен Size, то освобождается память размером TReal(Array[0])*Type+4 байта. Аргументу Array присваивается значение Null
  1. Аргументу Array присваивается значение NewArray(Type,Size), возвращается значение True, исполнение функции завершается.

Использование памяти

Ряд запросов, исполняемых различными компонентами, возвращают в качестве ответа указатели на массивы. В этих случаях действуют следующие правила:

  1. Если компонент получил пустой указатель (Null), то он сам создает массив необходимой длины.
  1. Если передан непустой указатель, но существующей длины массива недостаточно, то компонент освобождает память, занятую под переданный массив и создает новый массив необходимой длины.
  1. Освобождение памяти после использования массива лежит на вызывающем компоненте.

Если одному из компонентов не хватает памяти для выполнения запроса, то этот компонент может передать макрокомпоненту нейрокомпьютер запрос на дополнительную память. В этом случае макрокомпонент нейрокомпьютер передает всем компонентам запрос FreeMemory. При исполнении данного запроса каждый компонент должен освободить всю память, не являющуюся абсолютно необходимой для работы. Например, компонент задачник может для быстроты обработки держать в памяти все обучающее множество. Однако абсолютно необходимой является память, достаточная для хранения в памяти одного примера.

Запрос на освобождение памяти исполняется каждым компонентом и не включен в описания запросов компонентов, приведенные в следующих разделах.

Обработка ошибок

Схема обработки ошибок достаточно проста по своей идее - каждый новый обработчик ошибок может обрабатывать только часть ошибок, а обработку остальных может передать ранее установленному обработчику. Пользователь может организовать обработку ошибок и не прибегая к установке обработчика ошибок - обработчик ошибок по умолчанию почти во всех случаях устанавливает номер последней ошибки в переменную Error, которая может быть считана с помощью запроса GetError и обработана прямо в компоненте, выдавшем запрос.

Если обработчик ошибок устанавливает номер последней ошибки в переменной Error, то все запросы, поступившие после момента установки, завершаются неуспешно. Это состояние сбрасывается при вызове запроса «дать номер ошибки».

Процедура обработки ошибок

Процедура обработки ошибок должна удовлетворять следующим требованиям:

  • Это должна быть процедура с дальним типом адресации. Формат описания процедуры обработки ошибок
  • Far;ErrorFunc(Long ErrorNumber)

  • После обработки ошибок процедура может вызвать ранее установленный обработчик ошибок. Адрес ранее установленного обработчика ошибок процедура обработки ошибок получает в ходе следующей процедуры:
  • Вызов процедуры с нулевым номером ошибки означает, что в следующем вызове будет передан адрес старой процедуры обработки ошибок.
  • Значение аргумента ErrorNumber при вызове, следующем непосредственно за вызовом с нулевым номером ошибки, должно интерпретироваться как адрес старой процедуры обработки ошибок.

Ниже приведено описание запросов, связанных с обработкой ошибок и исполняемых макрокомпонентом нейрокомпьютер.

Установить обработчик ошибок (OnError)

Описание запроса:

Pascal:

Function OnError( NewError : ErrorFunc ) : Logic;

C:

Logic OnError(ErrorFunc NewError)

Описание аргументов:

NewError - адрес новой процедуры обработки ошибок.

Назначение – устанавливает новый обработчик ошибок.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Вызов NewError с аргументом 0 - настройка на установку цепочки обработки ошибок.
  1. Вызов NewError с аргументом ErrorManager (вместо длинного целого передается адрес старой процедуры обработки ошибок).
  1. ErrorManager := NewError

Дать номер ошибки (GetError)

Описание запроса:

Pascal:

Function GetError : Integer;

C:

Integer GetError()

Назначение - возвращает номер последней необработанной ошибки и сбрасывает ее.

Описание исполнения.

  1. GetError := Error
  1. Error := 0

Списки ошибок, возникающих в различных компонентах, даны в разделах «Ошибки компоненты ...», в соответствующих разделах. Все номера ошибок каждого компонента являются трехзначными числами и начинаются с номера компонента, указанного в колонке «Ошибка» табл. 16.

Запросы, однотипные для всех компонентов

Таблица 16

Префиксы компонентов

Префикс Компонент
Запроса Ошибки
ex 0 Исполнитель
tb 1 Задачник
pr 2 Предобработчик
nn 3 Сеть
es 4 Оценка
ai 5 Интерпретатор ответа
in 6 Учитель
cn 7 Контрастер

Ряд запросов обрабатывается всеми компонентами, кроме компонента исполнитель, носящего вспомогательный характер. Один из таких запросов – FreeMemory – был описан в разделе «Управление памятью», а два запроса, связанных с обработкой ошибок – в разделе «Обработка ошибок». В данном разделе приводятся описания остальных запросов, имеющих одинаковый смысл для всех компонентов. В отличие от ранее описанных запросов эти запросы опираются на структуру исполняющего компонента, поэтому к имени запроса добавляется префикс, задающий компонента. Список префиксов приведен в табл. 16. Единственным исключением из числа компонентов, исполняющих перечисленные в данном разделе запросы, является компонент исполнитель.

Все описываемые в данном разделе запросы можно разбить на четыре группы:

  1. Установление текущего компонента.
  1. Запросы работы со структурой компонента.
  1. Запросы на получение или изменение параметров структурной единицы.
  1. Запуск редактора компонента.

Все имена запросов начинаются с символов «xx», которые необходимо заменить на префикс из табл. 16 чтобы получить имя запроса для соответствующего компонента. При указании ошибок используется символ «n», который нужно заменить на соответствующий префикс ошибки из табл. 16.

Далее данном разделе компонентом также называются экземпляры компонента, а не только часть программы. Например, одна из загруженных нейронных сетей, а не только программный компонент сеть.

Запрос на установление текущего компонента

К этой группе запросов относится один запрос – xxSetCurrent – не исполняемый компонентом задачник.

Сделать текущей (xxSetCurrent)

Описание запроса:

Pascal:

Function xxSetCurrent( CompName : PString) : Logic;

C:

Logic xxSetCurrent(PString CompName)

Описание аргумента:

CompName – указатель на строку символов, содержащую имя компонента, которого надо сделать текущим.

Назначение – ставит указанного в параметре CompName компонента из списка загруженных компонентов на первое место в списке.

Описание исполнения.

  1. Если список компонентов пуст или имя компонента, переданное в аргументе CompName, в этом списке не найдено, то возникает ошибка n01 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Указанный в аргументе CompName компонент переносится в начало списка.

Запросы, работающие со структурой компонента

К этой группе относятся запросы, позволяющие выяснить структуру компонента, прочитать ее или сохранить на диске.

Добавление нового экземпляра (xxAdd)

Описание запроса:

Pascal:

Function xxAdd( CompName : PString ) : Logic;

C:

Logic xxAdd(PString CompName)

Описание аргумента:

CompName – указатель на строку символов, содержащую имя файла компонента или адрес описания компонента.

Назначение – добавляет новый экземпляр компонента в список компонентов.

Описание исполнения.

  1. Если в качестве аргумента CompName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя компонента и после пробела имя файла, содержащего компонента. В противном случае считается, что аргумент CompName содержит указатель на область памяти, содержащую описание компонента в формате для записи на диск. Если описание не вмещается в одну область памяти, то допускается включение в текст описания компонента ключевого слова Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.
  1. Экземпляр компонента считывается из файла или из памяти и добавляется первым в список компонентов (становится текущим).
  1. Если считывание завершается по ошибке, то возникает ошибка n02 – ошибка считывания компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
Удаление экземпляра компонента (xxDelete)

Описание запроса:

Pascal:

Function xxDelete( CompName : PString) : Logic;

C:

Logic xxDelete(PString CompName)

Описание аргумента:

CompName – указатель на строку символов, содержащую полное имя компонента.

Назначение – удаляет указанного в параметре CompName компонента из списка компонентов.

Описание исполнения.

  1. Если список компонентов пуст или имя компонента, переданное в аргументе CompName, в этом списке не найдено, то возникает ошибка n01 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.

Заметим, что попытка удаления младшей структурной единицы приводит к удалению всего компонента содержащего данную структурную единицу.

Запись компонента (xxWrite)

Описание запроса:

Pascal:

Function xxWrite( CompName : PString; FileName : PString) : Logic;

C:

Logic xxWrite(PString CompName, PString FileName)

Описание аргументов:

CompName – указатель на строку символов, содержащую имя компонента.

FileName – имя файла или адрес памяти, куда надо записать компонента.

Назначение – сохраняет в файле или в памяти компонента, указанного в аргументе CompName .

Описание исполнения.

  1. Если в качестве аргумента CompName дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является текущий компонент.
  1. Если список компонентов пуст или имя компонента, переданное в аргументе CompName, в этом списке не найдено, то возникает ошибка n01 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если в качестве аргумента FileName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя файла, для записи компонента. В противном случае FileName должен содержать пустой указатель. В этом случае запрос вернет в нем указатель на область памяти, куда будет помещено описание компонента в формате для записи на диск. Если описание не вмещается в одну область памяти, то в текст будет включено ключевое слово Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.
  1. Если во время сохранения компонентà возникнет ошибка, то генерируется ошибка n03 – ошибка сохранения компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
Вернуть имена структурных единиц (xxGetStructNames)

Описание запроса:

Pascal:

Function xxGetStructNames(CompName : PString; Var Names : PRealArray) : Logic;

C:

Logic xxGetStructNames(PString CompName, RealArray* Names)

Описание аргументов:

CompName – указатель на строку символов, содержащую имя компонента или полное имя его структурной единицы.

Names – массив указателей на имена структурных единиц.

Назначение – возвращает имена всех компонентов в списке компонентов или имена всех структурных единиц структурной единицы, указанной в аргументе CompName .

Описание исполнения.

  1. Если в качестве аргумента CompName дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является соответствующий программный компонент. В качестве ответа в указателе Names возвращается массив, каждый элемент которого является указателем на не подлежащую изменению символьную строку, содержащую имя компонента из списка. После адреса имени последнего компонента следует пустой указатель. Выполнение запроса успешно завершается.
  1. Если имя компонента, переданное в аргументе CompName, не найдено в списке компонентов, то возникает ошибка n01 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Возвращается массив, каждый элемент которого является указателем на не подлежащую изменению символьную строку, содержащую псевдоним структурной единицы, являющейся частью структурной единицы, указанной в аргументе CompName. Имена структурных единиц перечисляются в порядке следования в разделе описания состава структурной единицы, имя которой указано в аргументе CompName. Если одна из структурных единиц задана в описании состава несколькими экземплярами, то имя каждого экземпляра возвращается отдельно. После указателя на имя последней структурной единицы следует пустой указатель.
Вернуть тип структурной единицы (xxGetType)

Описание запроса:

Pascal:

Function xxGetType(CompName , TypeName : PString; Var TypeId : Integer) : Logic;

C:

Logic xxGetType(PString CompName, PString TypeName, Integer TypeId)

Описание аргументов:

CompName – указатель на строку символов, содержащую полное имя структурной единицы.

TypeName – возвращает указатель на строку символов, содержащую имя структурной единицы, данное ей при описании.

TypeId – одна из предопределенных констант, соответствующая типу структурной единицы.

Назначение – возвращает имя и тип структурной единицы.

Описание исполнения.

  1. Если список компонентов пуст или имя компонента, переданное в аргументе CompName, в этом списке не найдено, то возникает ошибка n01 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В переменной TypeId возвращается тип структурной единицы. Значения предопределенных констант, соответствующих различным типам структурных единиц различных компонентов приведены в табл. 11 и в соответствующих разделах, содержащих описания компонентов.
  1. Если структурная единица является стандартной, то указателю TypeName присваивается значение пустого указателя. Если структурная единица имеет пользовательский тип (значение аргумента TypeId равно -1), то указатель TypeName устанавливается на строку, содержащую имя, данное указанной в аргументе CompName структурной единице при ее описании.

Запросы на изменение параметров

К группе запросов на изменение параметров относятся три запроса: xxGetData – получить параметры структурной единицы. xxGetName – получить названия параметров и xxSetData – установить значения параметров структурной единицы.

Получить параметры (xxGetData)

Описание запроса:

Pascal:

Function xxGetData( CompName : PString; Var Param : PRealArray ) : Logic;

C:

Logic xxGetData(PString CompName, PRealArray* Param)

Описание аргументов:

CompName – указатель на строку символов, содержащую полное имя структурной единицы.

Param – адрес массива параметров.

Назначение – возвращает массив параметров структурной единицы, указанной в аргументе CompName .

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если список компонентов пуст или имя компонента, переданное в аргументе CompName, в этом списке не найдено, то возникает ошибка n01 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В массив, адрес которого передан в аргументе Param, заносятся значения параметров. Параметры заносятся в массив в порядке описания в разделе описания статических переменных. Статические переменные, описанные вне описания структурных единиц, считаются параметрами компонента.
Получить имена параметров (xxGetName)

Описание запроса:

Pascal:

Function xxGetName( CompName : PString; Var Param : PRealArray ) : Logic;

C:

Logic xxGetName(PString CompName, PRealArray* Param)

Описание аргументов:

CompName – указатель на строку символов, содержащую полное имя структурной единицы.

Param – адрес массива указателей на названия параметров.

Назначение – возвращает массив указателей на названия параметров структурной единицы, указанной в аргументе CompName .

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если список компонентов пуст или имя компонента, переданное в аргументе CompName, в этом списке не найдено, то возникает ошибка n01 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В массив, адрес которого передан в аргументе Param, заносятся адреса символьных строк, содержащих названия параметров.
Установить параметры (xxSetData)

Описание запроса:

Pascal:

Function xxSetData( CompName : PString; Param : PRealArray ) : Logic;

C:

Logic xxSetData(PString CompName, PRealArray Param)

Описание аргументов:

CompName – указатель на строку символов, содержащую полное имя структурной единицы.

Param – адрес массива параметров.

Назначение – заменяет значения параметров структурной единицы, указанной в аргументе CompName , на значения, переданные, в аргументе Param.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если список компонентов пуст или имя компонента, переданное в аргументе CompName, в этом списке не найдено, то возникает ошибка n01 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Параметры, значения которых хранятся в массиве, адрес которого передан в аргументе Param, передаются указанной в аргументе CompName структурной единице.
  1. Если исполняющим запрос компонентом является интерпретатор ответа (aiSetData), то генерируется запрос SetEstIntParameters к компоненту оценка. Аргументы генерируемого запроса совпадают с аргументами исполняемого запроса.

Инициация редактора компоненты

К этой группе запросов относится запрос, который инициирует работу не рассматриваемых в данной работе компонентов – редакторов компонентов.

Редактировать компонента (xxEdit)

Описание запроса:

Pascal:

Procedure xxEdit(CompName : PString);

C:

void xxEdit(PString CompName )

Описание аргумента:

CompName – указатель на строку символов – имя файла или адрес памяти, содержащие описание редактируемого компонента.

Если в качестве аргумента CompName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя компонента и после пробела имя файла, содержащего описание компонента. В противном случае считается, что аргумент CompName содержит указатель на область памяти, содержащую описание компонента в формате для записи на диск. Если описание не вмещается в одну область памяти, то допускается включение в текст описания компонента ключевого слова Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.

Если в качестве аргумента CompName передан пустой указатель или указатель на пустую строку, то редактор создает новый экземпляр компонента.

Задача, используемая в примерах

В разделах, посвященных описанию предобработчика, задачника, интерпретатора ответа и оценки в качестве примера используется метеорологическая задача. Входная база данных содержит значения следующих показателей:

Температура воздуха – действительное число, изменяющееся от 273 до 393 градусов Кельвина.

Облачность – бинарный признак, означающий наличие (2) или отсутствие облачности (1).

Направление ветра – неупорядоченный качественный признак, принимающий одно из восьми значений: 1 – северный, 2 – северо-восточный, 3 – восточный, и т.д.

Осадки – упорядоченный качественный признак, принимающий следующие значения: 1 – без осадков, 2 – слабые осадки, 3 – сильные осадки.

В качестве ответов требуется предсказать значения тех же показателей через 8 часов.

Стандарт первого уровня компонента задачник

В этом разделе приводится описание хранения задачника на внешнем носителе.

Язык описания задачника

В языке описания задачника используется ряд ключевых слов, специфических для этого языка. Эти ключевые слова приведены в табл. 17.

Таблица 17.

Ключевые слова специфические для языка описания задачника

Идентификатор Краткое описание Идентификатор Краткое описание
TaskBook Заголовок описания задачника Picture Поле типа рисунок
Structure Заголовок описания структуры задачника Source Описание источника данных
Field Начало описания поля External Описание внешнего источника данных

Список предопределенных констант языка описания задачника приведен в табл. 18. Эти константы используются при указании типа вектора, к которому принадлежит описываемое поле, при указании используемых векторов в запросе на открытие сеанса и при указании типа вектора в запросах на получение или занесение данных.

Таблица 18

Предопределенные константы

Идентификатор Значение Смысл Идентификатор Значение Смысл
tbColor 1 Цвет примера tbCalcAnswers 6 Полученные ответы
tbInput 2 Входной сигнал tbCalcReliability 7 Уверенность в ответе
tbPrepared 3 Предобработанные данные tbWeight 8 Вес примера
tbAnswers 4 Правильные ответы tbEstimation 9 Оценки
tbReliability 5 Достоверность ответа tbComment 10 Комментарии

БНФ языка описания задачника

Обозначения, принятые в данном расширении БНФ и описание ряда конструкций приведены в разделе «Описание языка описания компонентов».

<Описание задачника> ::= <Заголовок задачника> <Описание структуры задачника> <Описание источника данных> <Конец описания задачника>

<Заголовок задачника> ::= TaskBook <Имя задачника>

<Имя задачника> ::= <Идентификатор>

<Описание структуры задачника> ::= <Заголовок описания структуры> <Описание полей> <Описание цвета><Описание веса> <Конец описания структуры>

<Заголовок описания структуры> ::= Structure

<Описание цвета> ::= Field <Имя поля цвет> tbColor Color End Field

<Имя поля цвет> ::= <Константа типа String>

<Описание веса> ::= Field <Имя поля вес> tbWeight Real End Field

<Имя поля вес> ::= <Константа типа String>

<Описание полей> ::= <Описание поля> [<Описание полей>]

<Описание поля> ::= Field <Имя поля> <Тип вектора> {<Описание целого поля> | <Описание действительного поля> | <Описание перечислимого поля> | <Описание поля рисунка> | <Описание текстового поля>} End Field

<Имя поля> ::= <Константа типа String>

<Тип вектора> ::= {tbInput | tbAnswers | tbReliability | tbCalcAnswers | tbCalcReliability | tbEstimation}

<Описание целого поля> ::= {Long | Integer}

<Описание действительного поля> ::= Real

<Описание перечислимого поля> ::= Enumerated <Список имен значений> ;

<Список имен значений> ::= <Имя значения> [, <Список имен значений>]

<Имя значения> ::= <Константа типа String>

<Описание текстового поля> ::= String <Максимальная длина строки>

<Максимальная длина строки> ::= <Константа типа Integer>

<Описание поля рисунка> ::= Picture <Размер памяти для рисунка>

<Размер памяти для рисунка> ::= <Константа типа Long>

<Конец описания структуры> ::= End Structure

<Описание источника данных> ::= Source {<Внешний источник> | <Подготовлено в задачнике>}

<Внешний источник> ::= <Имя приложения, которому нужно передать запрос> <SQL – запрос>

<Имя приложения, которому нужно передать запрос> ::= <Константа типа String>

<SQL – запрос> ::= <Константа типа String>

<Подготовлено в задачнике> – В соответствии с порядком описания полей выводятся символьные представления полей, разделенные символом табуляции (байтом содержащим код 9). Примеры (в терминологии баз данных – записи) разделяются символом конца абзаца (переводом строки – байтом, содержащим код 13). Поля рисунки выводятся в виде последовательности <Размер памяти для рисунка> целых чисел, разделенных пробелами, каждое из которых является десятичным представлением числа (от 0 до 255), содержащегося в соответствующем байте области памяти, отведенной для хранения рисунка.

<Конец описания задачника> ::= End TaskBook

Описание языка описания задачника

В этом разделе приведено подробное описание дополнительной информации (информации, следующей за типом данных поля) для полей, в блоках описания которых она используется.

Перечислимый тип поля. При использовании перечислимого типа поля в векторах данных хранятся не сами значения, а их номера. Для отображения в редакторе задачника значений полей их необходимо брать из блока описания поля. В списке имен значений блока описания перечислимого поля хранятся символьные константы, первая из которых содержит название состояния, соответствующее неопределенному значению поля; вторая – первому из значений, которые может принимать поле, и т.д.

Строка. Поля типа строка предназначены для хранения символьных строк фиксированной длины. Длина строки задается значением параметра <Максимальная длина строки>.

Таблица 19

Значение первых семи байт поля типа рисунок

Величина Значение
Б2 * 256 + Б1 Положительное целое число, задающее размер рисунка по горизонтали в пикселях.
Б4 * 256 + Б3 Положительное целое число, задающее размер рисунка по вертикали в пикселях.
(Б7 * 256 + Б6) * 256 + Б5 Число цветов, использованных в рисунке

Рисунок. Поля типа рисунок предназначены для хранения графической информации. Первые семь байт поля имеют смысл, приведенный в табл. 19. В таблице принято обозначение Б1 – величина, хранящаяся в первом байте, Б2 – во втором и т.д. Рисунок разворачивается по строкам, начиная с левого верхнего угла, в непрерывный массив, размером (Б2*256+Б1)(Б4*256+Б3).

Если число цветов равно единице (черно-белое изображение), то каждый следующий байт содержит восемь пикселей изображения. Самый младший бит  восьмого байта соответствует левому верхнему пикселю рисунка. Если число цветов равно трем, то каждый байт, начиная с восьмого, содержит информацию о четырех пикселях. Младшие два бита задают левый верхний пиксель рисунка. Если число цветов от 4 до 15, то каждый байт, начиная с восьмого, содержит информацию о двух пикселях. Младшие четыре бита задают левый верхний пиксель рисунка. Если число цветов от 16 до 255, то каждый байт, начиная с восьмого, содержит информацию об одном пикселе. Значение в восьмом байте соответствует левому верхнему пикселю рисунка. При числе цветов от 256 до 65535 каждые два байта, начиная с восьмого, содержат информацию об одном пикселе (первый пиксель имеет цвет номер Б9*256+Б8). Значение в восьмом и девятом байтах соответствует левому верхнему пикселю рисунка. При числе цветов от 65535 до 16777215 каждые три байта, начиная с восьмого, содержат информацию об одном пикселе (первый пиксель имеет цвет номер (Б10*256+Б9)*256+Б8). Значение в восьмом, девятом и десятом байтах соответствует левому верхнему пикселю рисунка.

Альтернативный способ записи рисунка. Предложенный выше способ хорош своей простотой и плох большим объемом данных. Большинство графических форматов файлов (например GIF) обеспечивают высокую степень компрессии графической информации. Для использования этой возможности при записи поля графической информации на диск предлагается альтернативный формат. В этом формате первые два байта должны быть нулевыми. Поскольку в основном формате записи рисунков эти два байта формировали размер рисунка по горизонтали, нулевая ширина рисунка служит признаком использования альтернативного формата. Следующие пять байт хранят ASCII коды типа графического формата. Используются коды заглавных букв латинского алфавита. Если тип графического стандарта содержит менее пяти символов (PCX, GIF), то тип дополняется символами пробела справа. Следующие четыре байта, с восьмого по одиннадцатый, содержат число байт в графическом файле. Начиная с двенадцатого байта, идет информация, содержавшаяся в графическом файле.

Сопоставление элементов векторов правильных ответов, достоверности, вычисленных ответов, уверенности и оценки производится по следующему правилу. Первому полю типа правильный ответ соответствуют первое поле типа достоверность, первое поле типа вычисленный ответ, первое поле типа уверенность, первое поле типа оценка, второму – вторые и т.д.

Неопределенные значения

В практике работы большинство таблиц данных не полны. То есть, часть данных в примерах задачника не известна. Задачник должен однозначно указать предобработчику неизвестные данные. Для этих целей для каждого типа входных данных определено специальное значение - неопределенное. Для передачи неизвестных значений используются следующие величины: 10-40 для действительных чисел и 0 для всех типов качественных признаков.

Пример описания задачника

В этом разделе приведено описания простого задачника для прогнозирования курса американского доллара к рублю. Задачник содержит три примера. В разделе описания данных вместо символа табуляции использован символ «®», а вместо символа конца абзаца – «¿».

TaskBook CursValuty

Structure

      Field "Цвет" tbColor Color End Field

      Field "Вес" tbWeight Real End Field

      Field "Дата" tbComment Real End Field

      Field "Текущий курс" tbInput Real End Field

      Field "Курс на следующий день" tbAnswers Real End Field

      Field "Достоверность курса" tbReliability Real End Field

      Field "Предсказанный курс" tbCalcAnswers Real End Field

      Field "Надежность предсказания" tbCalcReliability Real End Field

      Field "Оценка предсказания" tbEstimation Real End Field

End Structure

Source

HFFFF®1.0®01.01.97®5773®5774®1.0®5775®0.1®0.07¿

HFFFF®1.0®02.01.97®5774®5776®1.0®5777®0.01®0.7¿

HFFFF®1.0®03.01.97®5776®5778®1.0®5779®0.2®0.007¿

End TaskBook

Стандарт второго уровня компонента задачник

В этом разделе описаны все запросы компонента задачник в виде процедур и функций. При описании используется синтаксис языков Turbo Pascal и С. В Паскаль варианте приведены заголовки функций и процедур. В С варианте – прототипы функций. Большинство запросов, реализуется в виде функций, сообщающих о корректности завершения операции.

Предполагается возможность одновременной работы нескольких сеансов одного задачника. Например, допускается редактирование задачника и одновременное обучение сети по тому же задачнику.

Все запросы к компоненту задачник можно разбить на следующие группы.

  1. Чтение и запись задачника.
  1. Начало и конец сеанса.
  1. Перемещение по примерам.
  1. Определение, получение и изменение данных.
  1. Окраска примеров.
  1. Установление структуры Задачника.
  1. Добавление и удаление примеров.
  1. Обработка ошибок.

Чтение и запись задачника

К этой группе запросов относятся запросы, работающие со всем задачником в целом. Эти запросы считывают задачник, сохраняют задачник на диске или выгружают ранее считанный или созданный задачник.

Прочитать задачник (tbAdd)

Описание запроса:

Pascal:

Function tbAdd( CompName : PString ) : Logic;

C:

Logic tbAdd( PString CompName )

Описание аргумента:

CompName – указатель на строку символов, содержащую имя файла задачника.

Назначение – служит для считывания задачника.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в данный момент считан задачник, то генерируется запрос tbDelete. Если запрос tbDelete завершается неуспешно, то генерируется внутренняя ошибка 104 – попытка считывания задачника при открытых сеансах ранее считанного задачника. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Первые четыре символа строки CompName составляют слово File. Остальная часть строки содержит имя компонента и после пробела имя файла, содержащего компонент.
  1. Если во время выполнения запроса возникает ошибка, то генерируется внутренняя ошибка 102 –  ошибка чтения задачника. Управление передается обработчику ошибок. Выполнение запроса прекращается. В противном случае выполнение запроса успешно завершается.

Записать задачник (tbWrite)

Описание запроса:

Pascal:

Function tbWrite( CompName, FileName : PString) : Logic;

C:

Logic tbWrite(PString CompName, PString FileName)

Описание аргументов:

CompName – указатель на строку символов, содержащую имя задачника.

FileName – имя файла, куда надо записать компонента.

Назначение – сохраняет задачник в файле.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса отсутствует считанный задачник, то возникает ошибка 101 – запрос при отсутствии задачника, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Задачник записывается в файл FileName под именем CompName.
  1. Если во время выполнения запроса возникает ошибка, то генерируется внутренняя ошибка 103 –  ошибка записи задачника. Управление передается обработчику ошибок. Выполнение запроса прекращается. В противном случае выполнение запроса успешно завершается.

Закрыть задачник (tbDelete)

Описание запроса:

Pascal:

Function tbDelete : Logic;

C:

Logic tbDelete()

Назначение – удаляет из памяти ранее считанный задачник.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если есть открытые сеансы, то возникает ошибка 105 – закрытие задачника при открытых сеансах. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Задачник закрывается. Запрос успешно завершается.

Начало и конец сеанса

К этой группе запросов относятся два запроса, открывающие и закрывающие сеансы работы с задачником.

Начало сеанса (InitSession)

Описание запроса:

Pascal:

Function InitSession( NewColor : Color; Oper : Integer; Var Handle: Integer ) : Logic;

C:

Logic InitSession(Color NewColor, Integer Oper, Integer* Handle)

Описание аргументов:

NewColor – цвет для отбора примеров задачника в текущую выборку.

Oper – операция для отбора в текущую выборку. Должна быть одной из констант CEqual, CIn, CInclude, Cxclude, CIntersect

Handle – номер сеанса. Начальное значение не важно. В этом аргументе возвращается номер сеанса.

Назначение – начинает сеанс. Отбирает текущую выборку.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Oper является недопустимым, то возникает ошибка 106 – недопустимый код операции при открытии сеанса, управление передается обработчику ошибок. Сеанс не открывается. Возвращается значение ложь.
  1. Создается новый сеанс (в одно-сеансовых задачниках просто инициируется сеанс). Номер сеанса заносится в аргумент Handle.
  1. Значения аргументов NewColor и Oper сохраняются во внутренних переменных задачника
  1. Указателю текущего примера присваивается состояние «до первого примера»
  1. InitSession := Next(Handle) – результат выполнения запроса совпадает с результатом выполнения вызванного запроса «Следующий пример».

Конец сеанса (EndSession)

Описание запроса:

Pascal:

Procedure EndSession( Handle : Integer );

C:

void EndSession(Integer Handle)

Назначение – закрывает сеанс.

Описание аргументов:

Handle – номер сеанса.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Освобождается вся память, взятая для выполнения сеанса. После этого сеанс завершается.

Перемещение по примерам

В эту группу запросов входят запросы позволяющие управлять положением текущего указателя в текущей выборке.

В начало (Home)

Описание запроса:

Pascal:

Function Íîìå( Handle : Integer ) : Logic;

C:

Logic Íîìå(Integer Handle)

Описание аргументов:

Handle – номер сеанса.

Назначение – делает текущим первый пример текущей выборки.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Указателю на текущий пример присваивается значение «до первого примера»
  1. Home := Next(Handle) – результат выполнения запроса совпадает с результатом выполнения вызванного запроса «Следующий»

В конец (End)

Описание запроса:

Pascal:

Function End( Handle : Integer ) : Logic;

C:

Logic End(Integer Handle)

Описание аргументов:

Handle – номер сеанса.

Назначение – делает текущим последний пример текущей выборки.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Указателю на текущий пример присваивается значение «после последнего примера»
  1. Home := Prev(Handle) – результат выполнения запроса совпадает с результатом выполнения вызванного запроса «Предыдущий»

Следующий (Next)

Описание запроса:

Pascal:

Function Next( Handle : Integer ) : Logic;

C:

Logic Next(Integer Handle)

Описание аргументов:

Handle – номер сеанса.

Назначение – делает текущим следующий пример текущей выборки.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Если значение указателя равно «после последнего примера», то возникает ошибка 108 – переход за конечную границу текущей выборки, и управление передается обработчику ошибок. В случае возврата управления в запрос, происходит немедленный выход из запроса с возвращением значения ложь.
  1. Если значение указателя текущего примера равно «до первого примера», то присваиваем указателю адрес первого примера задачника. Если адрес в переменной в задачнике нет примеров, то возникает ошибка 108 – переход за конечную границу текущей выборки, и управление передается обработчику ошибок. В случае возврата управления в запрос, происходит немедленный выход из запроса с возвращением значения ложь. В противном случае переходим к шагу 6
  1. Указатель перемещается на следующий пример задачника. Если следующего примера задачника нет, то указателю присваивается значение «после последнего примера».
  1. Переходим к шагу 5, если не верно условие:
NewColor) And Last,
NewColor – аргументы запроса InitSession, которым был открыт данный сеанс.
  1. Next := Not Last (Переход к следующему примеру завершился удачно, если указатель не установлен в значение «после последнего примера»).

Предыдущий (Prev)

Описание запроса:

Pascal:

Function Prev( Handle : Integer ): Logic;

C:

Logic Prev(Integer Handle)

Описание аргументов:

Handle – номер сеанса.

Назначение – делает текущим предыдущий пример текущей выборки.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Если значение указателя равно «до первого примера», то возникает ошибка 109 – переход за начальную границу текущей выборки, и управление передается обработчику ошибок. В случае возврата управления в запрос, происходит немедленный выход из запроса с возвращением значения ложь.
  1. Если значение указателя равно «после последнего примера», то присваиваем указателю адрес последнего примера задачника. Если в задачнике нет примеров, то возникает ошибка 109 – переход за начальную границу текущей выборки, и управление передается обработчику ошибок. В случае возврата управления в запрос, происходит немедленный выход из запроса с возвращением значения ложь.
  1. В противном случае шаг 7.
  1. Указатель перемещается на предыдущий пример задачника. Если предыдущего примера задачника нет, то указателю присваивается значение «до первого примера».
  1. Шаг 6 повторяется до тех пор, пока не выполнится условие:
  First
  1. Next := Not Last (Переход к следующему примеру завершился удачно, если указатель не установлен в значение «после последнего примера»).

Конец (Last)

Описание запроса:

Pascal:

Function Last( Handle : Integer ) : Logic;

C:

Logic Last(Integer Handle)

Описание аргументов:

Handle – номер сеанса.

Назначение – возвращает значение истина, если текущим является состояние «после последнего примера», и ложь – в противном случае.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Возвращает значение истина, если текущим является состояние «после последнего примера», и ложь – в противном случае.

Начало (First)

Описание запроса:

Pascal:

Function First( Handle : Integer ): Logic;

C:

Logic First(Integer Handle)

Описание аргументов:

Handle – номер сеанса.

Назначение – возвращает значение истина, если текущим является состояние «перед первым примером», и ложь в противном случае.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Возвращает значение истина, если текущим является состояние «перед первым примером», и ложь в противном случае.

Пример номер (Example)

Описание запроса:

Pascal:

Function Example( Number : Long; Handle : Integer ) : Logic;

C:

Logic Example(Long Number, Integer Handle)

Описание аргументов:

Number – номер примера, который должен быть сделан текущим. Нумерация примеров ведется с единицы.

Handle – номер сеанса.

Назначение – делает текущим пример текущей выборки с указанным номером.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Указатель устанавливается в состояние «до первого примера».
  1. Number раз выполняем запрос Next.
  1. Example := Not Last (Если не установлено состояние «после последнего примера», то запрос выполнен успешно).

Определение, получение и изменение данных

К данной группе запросов относятся запросы позволяющие получать данные из задачника, заносить данные в задачник и сбросить предобработку (необходимо выполнить данный запрос после изменений в данных или предобработчике, если задачник хранит векторы предобработанных данных)

Дать пример (Get)

Описание запроса:

Pascal:

Function Get( Handle : Integer; Var Data : PRealArray; What : Integer ) : Logic;

C:

Logic Get(Integer Handle, PRealArray* Data, Integer What)

Описание аргументов:

Handle – номер сеанса;

Data – указатель на массив, в котором должны быть возвращены данныt;

What – одна из предопределенных констант tbColor, tbInput, tbPrepared, tbAnswers, tbReliability, tbCalcAnswers, tbCalcReliability, tbWeight, tbEstimation, tbComment

Назначение – возвращает указанную в запросе информацию.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Если аргумент What имеет недопустимое значение, то возникает ошибка 110 – неверный тип вектора в запросе Get. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Если текущий указатель указывает на одно из состояний «до первого примера» или «после последнего примера», то возникает ошибка 111 – попытка чтения до или после текущей выборки. Управление передается обработчику ошибок. Запрос завершается неуспешно.
  1. Если в аргументе What указан вектор предобработанных данных, но в текущем примере он отсутствует, то генерируется запрос предобработать данные. Если предобработка завершается успешно, то полученный вектор предобработанных данных включается в пример, в противном случае выполнение запроса прекращается. Возвращается значение ложь.
  1. В элементы массива, на который указывает аргумент Data, копируются данные из того вектора данных текущего примера, который указан в аргументе What. Если требуемый вектор в задачнике отсутствует, то возникает ошибка 112 – данные отсутствуют и запрос завершается со значением ложь. В противном случае запрос успешно завершается.

Обновить данные (Put)

Описание запроса:

Pascal:

Function Put( Handle : Integer; Data : PRealArray; What : Integer ) : Logic;

C:

Logic Put(Integer Handle, PRealArray Data, Integer What)

Описание аргументов:

Handle – номер сеанса

Data – указатель на массив, в котором переданы данные, которые должны быть занесены в задачник.

What – одна из предопределенных констант tbColor, tbInput, tbPrepared, tbAnswers, tbReliability, tbCalcAnswers, tbCalcReliability, tbWeight, tbEstimation, tbComment

Назначение – обновить данные текущего примера

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Если аргумент What имеет недопустимое значение, то возникает ошибка 113 – неверный тип вектора в запросе Put. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Если текущий указатель указывает на одно из состояний «до первого примера» или «после последнего примера», то возникает ошибка 111 – попытка чтения до или после текущей выборки. Управление передается обработчику ошибок. Запрос завершается неуспешно.
  1. Если устанавливается вектор входных данных, то для текущего примера должен быть освобожден вектор предобработанных данных.
  1. В данные примера копируются значения, указанные в массиве Data. Запрос успешно завершается.

Сбросить предобработку (RemovePrepare)

Описание запроса:

Pascal:

Procedure RemovePrepare;

C:

void RemovePrepare()

Назначение – отмена предобработки всех ранее предобработанных примеров.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. У всех примеров задачника освобождаются вектора предобработанных данных.

Окраска примеров

В данный раздел помещены запросы для работы с цветами. Отметим, что цвет примера, возвращаемый запросом GetColor можно получить также с помощью запроса Get.

Дать цвет примера (GetColor)

Описание запроса:

Pascal:

Function GetColor( Handle : Integer ) : Color;

C:

Logic GetColor(Integer Handle)

Описание аргументов:

Handle – номер сеанса

Назначение – возвращает цвет текущего примера.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Если текущий указатель указывает на одно из состояний «до первого примера» или «после последнего примера», то возникает ошибка 111 – попытка чтения до или после текущей выборки. Управление передается обработчику ошибок. Запрос завершается неуспешно.
  1. Возвращается цвет текущего примера.

Покрасить пример (PaintCurrent)

Описание запроса:

Pascal:

Function PaintCurrent( Handle : Integer; NewColor, ColorMask : Color; Oper : Integer) : Logic;

C:

Logic PaintCurrent(Integer Handle, Color NewColor, Color ColorMask, Integer Oper)

Описание аргументов:

Handle – номер сеанса.

NewColor – новый цвет для окраски примера.

ColorMask – маска цвета для окраски примера.

Oper – операция, используемая при окраске примера. Должна быть одной из констант COr, CAnd, CXor, CNot.

Назначение – изменяет цвет текущего примера.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если аргумент Handle не корректен возникает ошибка 107 – неверный номер сеанса. Управление передается обработчику ошибок. Выполнение запроса прекращается.
  1. Если Oper не корректен, то возникает ошибка 114 – неверная операция окраски примера. Управление передается обработчику ошибок. Запрос завершается со значением ложь.
  1. Новый цвет примера := (Старый цвет примера And ColorMask) Oper NewColor

Ошибки компонента задачника

В табл. 20 приведен полный список ошибок, которые могут возникать при выполнении запросов компонентом задачник, и действия стандартного обработчика ошибок.

Таблица 20.

Ошибки компонента задачник и действия стандартного обработчика ошибок.

Название ошибки Стандартная обработка
101 Запрос при отсутствии задачника Занесение номера в Error
102 Ошибка чтения задачника Занесение номера в Error
103 Ошибка записи задачника Занесение номера в Error
104 Попытка считывания задачника при открытых сеансах ранее считанного задачника Занесение номера в Error
105 Закрытие задачника при открытых сеансах Занесение номера в Error
106 Недопустимый код операции при открытии сеанса Занесение номера в Error
107 Неверный номер сеанса Занесение номера в Error
108 Переход за конечную границу текущей выборки Игнорируется
109 Переход за начальную границу текущей выборки Игнорируется
110 Неверный тип вектора в запросе Get Занесение номера в Error
111 Попытка чтения до или после текущей выборки Занесение номера в Error
112 Данные отсутствуют Игнорируется
113 Неверный тип вектора в запросе Put Занесение номера в Error
114 Неверная операция окраски примера Занесение номера в Error

Стандарт первого уровня компонента предобработчик

Данный раздел посвящен описанию стандарта языка описания и хранения на внешнем носителе компонента предобработчик. Поскольку крайне редко встречаются случаи, когда сеть получает один входной сигнал, предобработчик всегда является составным. Построение предобработчика происходит в редакторе предобработчика. Для описания предобработчика предлагается использовать специальный язык.

Неопределенные значения

В практике работы большинство таблиц данных не полны. То есть, часть данных в примерах задачника неизвестна. Задачник должен однозначно указать предобработчику неизвестные данные. Для этих целей для каждого типа входных данных определено специальное значение - неопределенное. Для передачи неизвестных значений используются следующие величины: 10-40 для действительных чисел и 0 для всех типов качественных признаков.

Стандартные предобработчики

В большинстве случаев достаточно использовать стандартные предобработчики, список которых приведен в табл. 11. Ниже в данном разделе приведено описание параметров стандартных предобработчиков.

Все стандартные предобработчики получают в качестве аргументов массивы входной информации и входных сигналов. Кроме того, они содержат различные наборы параметров. Алгоритмы выполнения стандартных предобработчиков приведены в разделе «Пример описания предобработчика». Далее описаны наборы параметров стандартных предобработчиков. Все параметры должны быть описаны как статические переменные.

Предобработка бинарного признака (BinaryPrep). Предобработка производится в соответствии с табл. 4. главы «Предобработчик» Принимает одно входное данное и генерирует один входной сигнал. Предобработчик содержит следующие параметры.

MinSignals, MaxSignals – значения нижней и верхней границ интервала приемлемых входных сигналов, соответственно. По умолчанию эти величины равны -1 и 1, соответственно.

Unknown– значение сигнала, который будет выдан, если значение входного признака не определено (0). По умолчанию эта величина равна (MinSignals+MaxSignals)/2.

Type – тип предобработки бинарного признака. Если значение параметра Type – истина, то производится предобработка по типу «Наличие другого свойства», если ложь, то по типу «Отсутствие заданного свойства». По умолчанию значение этого параметра равно истина.

Предобработка неупорядоченного качественного признака (UnOrdered). Предобработка производится в соответствии с табл. 5 главы «Предобработчик». Принимает одно входное данное и генерирует Num входных сигналов. Предобработчик содержит следующие параметры.

MinSignals, MaxSignals – значения нижней и верхней границ интервала приемлемых входных сигналов, соответственно. По умолчанию эти величины равны -1 и 1, соответственно.

Unknown– значение сигналов, которые будут выданы, если значение входного признака не определено (0). По умолчанию эта величина равна (MinSignals+MaxSignals)/2.

Num – число состояний качественного признака (число генерируемых входных сигналов). По умолчанию значение этого параметра равно 2.

Предобработка упорядоченного качественного признака (Ordered). Предобработка производится в соответствии с табл. 6 главы «Предобработчик». Принимает одно входное данное и генерирует Num входных сигналов. Предобработчик содержит следующие параметры.

MinSignals, MaxSignals – значения нижней и верхней границ интервала приемлемых входных сигналов, соответственно. По умолчанию эти величины равны -1 и 1, соответственно.

Unknown– значение сигналов, которые будут выданы, если значение входного признака не определено (0). По умолчанию эта величина равна (MinSignals+MaxSignals)/2

Num – число состояний качественного признака (число генерируемых входных сигналов). По умолчанию значение этого параметра равно 2.

Простейший предобработчик (EmptyPrep). Предобработка производится в соответствии с формулой (1). Принимает одно входное данное и генерирует один входной сигнал. Предобработчик содержит следующие параметры.

MinSignals, MaxSignals – значения нижней и верхней границ интервала приемлемых входных сигналов, соответственно. По умолчанию эти величины равны -1 и 1, соответственно.

Unknown– значение сигнала, который будет выдан, если значение входного признака не определено (10-40). По умолчанию эта величина равна 0.

MinData, MaxData – значения нижней и верхней границ интервала изменения входных данных, соответственно. По умолчанию эти величины равны -1 и 1, соответственно. Эти значения могут быть определены поиском минимального и максимального значений по задачнику, однако предобработчик не может выполнить эту процедуру.

Модулярный предобработчик (ModPrep). Предобработка производится в соответствии с формулой (16). Принимает одно входное данное и генерирует столько входных сигналов, сколько элементов в массиве Y (нулевой элемент массива содержит число элементов). Предобработчик содержит следующие параметры.

MinSignals, MaxSignals – значения нижней и верхней границ интервала приемлемых входных сигналов, соответственно. По умолчанию эти величины равны -1 и 1, соответственно.

Unknown– значение сигналов, которые будут выданы, если значение входного признака не определено (10-40). По умолчанию эта величина равна 0.

Y – массив величин, используемых для предобработки (см. раздел «Модулярная предобработка»).

Функциональный предобработчик (FuncPrep). Предобработка производится в соответствии с формулой (17). Принимает одно входное данное и генерирует столько входных сигналов, сколько элементов в массиве Y (нулевой элемент массива содержит число элементов). Предобработчик содержит следующие параметры.

MinSignals, MaxSignals – значения нижней и верхней границ интервала приемлемых входных сигналов, соответственно. По умолчанию эти величины равны -1 и 1, соответственно.

Unknown– значение сигналов, которые будут выданы, если значение входного признака не определено (10-40). По умолчанию эта величина равна 0.

MinData, MaxData – значения нижней и верхней границ интервала изменения функции F от входных данных, соответственно. По умолчанию эти величины равны -1 и 1, соответственно. Эти значения могут быть определены поиском минимального и максимального значений функции по задачнику, однако предобработчик не может выполнить эту процедуру.

Y – массив величин, используемых для предобработки (см. раздел «Функциональная предобработка»).

F – имя однопараметрической функции действительного типа (ее адрес) используемой для предобработки.

Позиционный предобработчик (PositPrep). Предобработка производится в соответствии с формулой (19). Принимает одно входное данное и генерирует Num входных сигналов. Предобработчик содержит следующие параметры.

MinSignals, MaxSignals – значения нижней и верхней границ интервала приемлемых входных сигналов, соответственно. По умолчанию эти величины равны -1 и 1, соответственно.

Unknown– значение сигналов, которые будут выданы, если значение входного признака не определено (10-40). По умолчанию эта величина равна 0.

Y – основание системы счисления (см. раздел «Функциональная предобработка»). По умолчанию эта величина равна 2.

Num – число цифр в представлении входного сигнала. По умолчанию эта величина равна 2.

Язык описания предобработчика

Предобработчик является составным объектом. В состав этого объекта входят частные предобработчики, правила распределения входных данных и входных сигналов сети между частными предобработчиками. Предобработчик при выполнении запроса на предобработку вектора входных данных получает на входе вектор исходных данных, а возвращает вектор входных сигналов сети.

Каждый частный интерпретатор ответа получает на входе вектор входных данных, которые он предобрабатывает, а на выходе дает вектор входных сигналов сети. Каждый частный интерпретатор описывается в виде процедурного блока.

В табл. 22 приведен список ключевых слов языка описания предобработчика, дополняющий список ключевых слов, приведенных в разделе «Общий стандарт». Кроме того, ключевыми словами являются имена стандартных предобработчиков, приведенные в табл. 21.

Таблица 21

Стандартные предобработчики

Идентификатор Параметры Тип Описание
BinaryPrep MinSignals, MaxSignals : Real;
Unknown: Real; Type : Logic.
Binary Бинарный признак. Предобработка в соответствии с табл. 4 главы «Предобработчик».
UnOrdered MinSignals, MaxSignals : Real;
Unknown: Real; Num : Long
Unordered Неупорядоченный качественный признак. Предобработка в соответствии с табл. 5 главы «Предобработчик».
Ordered MinSignals, MaxSignals : Real;
Unknown: Real; Num : Long
Ordered Упорядоченный качественный признак. Предобработка в соответствии с табл. 6 главы «Предобработчик».
EmptyPrep MinData, MaxData, Unnown,
MinSignals, MaxSignals : Real
Number Простейшая предобработка в соответствии с формулой (1) главы «Предобработчик».
ModPrep MinSignals, MaxSignals : Real;
Unknown: Real; Y : RealArray
Number Модулярная предобработка в соответствии с формулой (16) главы «Предобработчик».
FuncPrep MinSignals, MaxSignals, Unknown: Real; Y : RealArray; F : FuncType Number Функциональная предобработка в соответствии с формулой (17) главы «Предобработчик».
PositPrep MinSignals, MaxSignals, Unnown, Y : Real; Num : Long Number Позиционная предобработка в соответствии с формулой (19) главы «Предобработчик».

Таблица 22

Ключевые слова языка описания предобработчика.

Идентификатор Краткое описание
Connections Начало блока описания распределения входных данных и сигналов.
Contents Начало блока описания состава интерпретатора.
Data Имя, по которому адресуются входные данные, начало блока описания входных данных
Include Предшествует имени файла, целиком вставляемого в это место описания.
NumberOf Функция. Возвращает число обрабатываемых частным предобработчиком входных данных или сигналов.
Prep Начало заголовка описания частного предобработчика.
Preparator Заголовок раздела файла, содержащий описание интерпретатора.
Signals Имя, по которому адресуются входные сигналы; начало блока описания сигналов.

БНФ языка описания предобработчика

Обозначения, принятые в данном расширении БНФ и описание ряда конструкций приведены в разделе «Описание языка описания компонентов».

<Описание предобработчика> ::= <Заголовок> [<Описание функций>] [<Описание частных предобработчиков>] <Описание состава> [<Установление параметров>] [<Описание сигналов>] [<Описание данных>] [<Описание распределения сигналов>] [<Описание распределения данных>] <Конец описания предобработчика>

<Заголовок> ::= Preparator <Имя предобработчика> ( <Список формальных аргументов> )

<Имя предобработчика> ::= <Идентификатор>

<Описание частных предобработчиков> ::= <Описание частного предобработчика> [<Описание частных предобработчиков>]

<Описание частного предобработчика> ::= <Заголовок описания предобработчика> [<Описание статических переменных>] [<Описание переменных>] <Тело предобработчика>

<Заголовок описания предобработчика> ::= Prep <Имя частного предобработчика> ([(<Список формальных аргументов>)])

<Имя частного интерпретатора> ::= <Идентификатор>

<Тело предобработчика> ::= Begin <Составной оператор> End

<Описание состава> ::= Contents <Список имен предобработчиков> ;

<Список имен предобработчиков> ::= <Имя предобработчика> [,<Список имен предобработчиков>]

<Имя предобработчика> ::= <Псевдоним>: {<Имя ранее описанного интерпретатора> | <Имя стандартного интерпретатора>} [[<Число экземпляров >]] [(<Список фактических аргументов>)]

<Псевдоним> ::= <Идентификатор>

<Число экземпляров > ::= <Целое число>

<Имя ранее описанного интерпретатора> ::= <Идентификатор>

<Имя стандартного интерпретатора> ::= <Идентификатор>

<Установление параметров> ::= <Установление параметров Частного предобработчика> [;<Установление параметров>]

<Описание сигналов> ::= Signals <Константное выражение типа Long>

<Описание данных> ::= Data <Константное выражение типа Long>

<Описание распределения сигналов> ::= <Описание распределения Сигналов, Предобработчика, Частного предобработчика, Signals>

<Описание распределения данных> ::= <Описание распределения Данных, Предобработчика, Частного предобработчика, Data>

<Конец описания предобработчика> ::= End Preparator

Описание языка описания предобработчика

Структура описания предобработчика имеет вид: заголовок; описание функций; описание частных предобработчиков; описание состава; установление параметров; описание сигналов; описание данных; описание распределения сигналов; описание распределения данных; конец описания предобработчика.

Заголовок состоит из ключевого слова Preparator и имени предобработчика и служит для обозначения начала описания предобработчика в файле, содержащем несколько компонентов нейрокомпьютера.

Описание функций – фрагмент описания, в котором описаны функции, необходимые для работы предобработчиков.

Описание частного предобработчика – это описание процедуры, вычисляющей входные сигналы нейронной сети по входным данным. Формальные аргументы служат для задания размерностей обрабатываемых векторов. При выполнении частный предобработчик получает в качестве аргументов два вектора – входных данных и входных сигналов. Формально, при исполнении частный предобработчик имеет описание следующего вида:

Pascal:

Procedure Preparator(Data, Signals : PRealArray);

C:

void Preparator(PRealArray Data; PRealArray Signals);

В разделе описания состава перечисляются частные предобработчики, входящие в состав предобработчика. Признаком конца раздела служит символ «;».

В необязательном разделе установления параметров производится задание значений параметров (статических переменных) частных предобработчиков. После ключевого слова SetParameters следует список значений параметров в том порядке, в каком параметры были объявлены при описании частного интерпретатора (для стандартных интерпретаторов порядок параметров соответствует порядку, приведенному в описании стандартных предобработчиков в разделе «Стандартные предобработчики»). При использовании одного оператора задания параметров для задания параметров нескольким экземплярам одного частного предобработчика после ключевого слова SetParameters указывается столько выражений, задающих значения параметров, сколько необходимо для одного экземпляра.

В необязательном разделе «описание сигналов» указывается число сигналов, вычисляемых предобработчиком. Если этот раздел опущен, то полагается, что число вычисляемых предобработчиком сигналов равно сумме сигналов, вычисляемых всеми частными предобработчиками. В константном выражении возможно использование функции NumberOf, аргументом которой является имя частного предобработчика (или его псевдоним) и ключевое слово Signals, в качестве второго аргумента.

В необязательном разделе «описание данных» указывается число входных данных, предобрабатываемых предобработчиком. Если этот раздел опущен, то полагается, что число предобрабатываемых предобработчиком данных равно сумме данных, предобрабатываемых всеми частными предобработчиками. В константном выражении возможно использование функции NumberOf, аргументом которой является имя частного предобработчика (или его псевдоним) и ключевое слово Data, в качестве второго аргумента.

В необязательном разделе описания распределения сигналов (данных) указывается для каждого частного предобработчика какие сигналы (входные данные) из общего вектора сигналов (данных) передаются ему для обработки.

Наиболее часто встречающиеся интерпретаторы объявлены стандартными. Для стандартных интерпретаторов описание частных интерпретаторов отсутствует.

Кроме того, в любом месте описания интерпретатора могут встречаться комментарии, заключенные в фигурные скобки.

Пример описания предобработчика

В этом разделе приведены два примера описания одного и того же предобработчика для метеорологической задачи. Используется следующий состав предобработчика: первый элемент вектора входных данных (температура воздуха) обрабатывается простейшим предобработчиком (EmptyPrep); второй (облачность) – бинарным предобработчиком (BinaryPrep); третий (направление ветра) – предобработчиком неупорядоченных качественных признаков (UnOrdered); четвертый (осадки) – предобработчиком неупорядоченных качественных признаков (Ordered).

В первом примере приведено описание дубликатов всех стандартных предобработчиков. Во втором – использованы стандартные предобработчики.

Пример 1.

Preparator Meteorology

Function Sigmoid( X Real ) : Real;

      Begin

             Sigmoid = X / (1 + Abs(X))

      End;

Prep BinaryPrep1 ()                      {Предобработка бинарного признака}

      Static

             Real MinSignals Name "Нижняя граница интервала приемлемых сигналов";

             Real MaxSignals Name "Верхняя граница интервала приемлемых сигналов";

             Real Unknown Name "Значение сигнала, если значение входного признака не определено";

             Logic Type Name "Тип предобработки бинарного признака";

      Begin

             If TLong(Data[1]) = UnknownLong Then Signals[1] = Unknown

             Else Begin

                   If Type Then Begin

                         If TLong(Data[1]) = 1 Then Signals[1] = 0 Else Begin

                                If MaxSignals =0 Then Signals[1] = MinSignals

                                                                      Else Signals[1] = MaxSignals

                         End

                   Else Begin

                         If TLong(Data[1]) = 1       Then Signals[1] = MinSignals

                                                                      Else Signals[1] = MaxSignals

                   End

             End

      End

{Предобработка упорядоченного качественного признака}

Prep UnOrdered1 ( Num : Long )

      Static

             Real MinSignals Name "Нижняя граница интервала приемлемых сигналов";

             Real MaxSignals Name "Верхняя граница интервала приемлемых сигналов";

             Real Unknown Name "Значение сигнала, если значение входного признака не определено";

      Var

             Integer I;

      Begin

             If TLong(Data[1]) = UnknownLong Then Begin

                   For I = 1 To Num Do

                         Signals[I] = Unknown

             End Else Begin

                   For I = 1 To Num Do

                         Signals[I] = MinSignals

                   Signals[TLong(Data[1])] = MaxSignals

             End

      End

Prep Ordered1 ( Num : Long ) {Предобработка упорядоченного качественного признака}

      Static

             Real MinSignals Name "Нижняя граница интервала приемлемых сигналов";

             Real MaxSignals Name "Верхняя граница интервала приемлемых сигналов";

             Real Unknown Name "Значение сигнала, если значение входного признака не определено";

      Var

             Integer I;

      Begin

             If TLong(Data[1]) = UnknownLong Then Begin

                   For I = 1 To Num Do

                         Signals[I] = Unknown

             End Else Begin

                   For I = 1 To TLong(Data[1]) Do

                         Signals[I] = MaxSignals

                   For I = TLong(Data[1])+1 To Num Do

                         Signals[I] = MinSignals

             End

      End

Prep EmptyPrep1 ()          {Предобработчик, осуществляющий масштабирование и сдвиг сигнала}

      Static

             Real MinSignals Name "Нижняя граница интервала приемлемых сигналов";

             Real MaxSignals Name "Верхняя граница интервала приемлемых сигналов";

             Real Unknown Name "Значение сигнала, если значение входного признака не определено";

             Real MinData Name "Значения нижней границы интервала изменения входных данных";

             Real MaxData Name "Значения верхней границы интервала изменения входных данных";

      Begin

             If Data[1] = UnknownReal Then Signals[1] = Unknown

             Else Signals[1] = (Data[1] – MinData) * (MaxSignals – MinSignals) /    

                                                         (MaxData – MinData) + MinSignals

      End

Prep ModPrep1 ( Num : Long )         {Модулярный предобработчик}

      Static

             Real MinSignals Name "Нижняя граница интервала приемлемых сигналов";

             Real MaxSignals Name "Верхняя граница интервала приемлемых сигналов";

             Real Unknown Name "Значение сигнала, если значение входного признака не определено";

             RealArray[Num] Y Name "Массив величин, используемых для предобработки"

      Var

             Integer I;

      Begin

             If Data[1] = UnknownReal Then Begin

                   For I = 1 To Num Do

                         Signals[I] = Unknown

             End Else Begin

                   For I = 1 To Num Do

                         Signals[I] = (Data[1] RMod Y[I] + Y[I]) * (MaxSignals – MinSignals) /

                                                         (2 * Y[I]) + MinSignals

      End

Prep FuncPrep1(Num : Long; F : FuncType)       {Функциональный предобработчик}

      Static

             Real MinSignals Name "Нижняя граница интервала приемлемых сигналов";

             Real MaxSignals Name "Верхняя граница интервала приемлемых сигналов";

             Real Unknown Name "Значение сигнала, если значение входного " +

                                                               "признака не определено";

             Real MinData Name "Значения нижней границы интервала изменения значений функции F ";

             Real MaxData Name "Значения верхней границы интервала изменения значений функции F";

             RealArray[Num] Y Name "Массив величин, используемых для предобработки"

      Var

             Integer I;

      Begin

             If Data[1] = UnknownReal Then Begin

                   For I = 1 To Num Do

                         Signals[I] = Unknown

             End Else Begin

                   For I = 1 To Num Do

                          Signals[1] = (F(Data[1] – Y[1] – MinData) * (MaxSignals – MinSignals) /

                                            (MaxData – MinData) + MinSignals

      End

Prep PositPrep1( Num : Long )         {Позиционный предобработчик}

      Static

             Real MinSignals Name "Нижняя граница интервала приемлемых сигналов"

             Real MaxSignals Name "Верхняя граница интервала приемлемых сигналов"

             Real Unknown Name "Значение сигнала, если значение входного признака не определено";

             Real Y Name "Основание системы счисления"

      Var

             Integer I;

             Real W, Q;

      Begin

             If Data[1] = UnknownReal Then Begin

                   For I = 1 To Num Do

                         Signals[I] = Unknown

             End Else Begin

                   W = Data[1];

                   For I = 1 To Num Do Begin

                         Q = W RMod Y;

                         Signals[I] = Q * (MaxSignals – MinSignals) / Y + MinSignals;

                         W = (W - Q) / Y

                   End;

      End

Contents Temp : EmptyPrep1, Cloud : BinaryPrep1, Wind : UnOrdered1(8), Rain : Ordered1(3);

{Для всех предобработчиков приемлемые значения входных сигналов лежат в интервале от -1 до 1. В случае неопределенного значения во входных данных все сигналы данного предобработчика полагаются равными нулю. Входные данные первого предобработчика меняются от 273 до 293}

Temp SetParameters -1, 1, 1E-40, 273, 293;

Cloud SetParameters -1, 1, 0, True;

Wind SetParameters -1, 1, 0;

Rain SetParameters -1, 1, 0

Signals NumberOf(Signals,Temp) + NumberOf(Signals, Cloud) +

                   NumberOf(Signals, Wind(8)) + NumberOf(Signals, Rain(3))

Data NumberOf(Data,Temp) + NumberOf(Data, Cloud) +

                   NumberOf(Data,Wind(8)) + NumberOf(Data, Rain(3))

Connections

      Temp.Data <=> Data[1];

      Cloud.Data <=> Data[2];

      Wind.Data <=> Data[3];

      Rain.Data <=> Data[4];

      Temp.Signals <=> Signals[1];

      Cloud.Signals <=> Signals[2];

      Wind.Signals[1..8] <=> Signals[3..10];

      Rain.Signals[1..3] <=> Signals[11..13]

End Preparator

Пример 2.

Preparator Meteorology

Contents Temp : EmptyPrep, Cloud : BinaryPrep, Wind : UnOrdered(8),

                                            Rain : Ordered(3);

Temp SetParameters -1, 1, 1E-40, 273, 293

End Preparator

Стандарт второго уровня компонента предобработчик

Запросы к компоненту предобработчик можно разбить на пять групп:

  1. Предобработка.
  1. Изменение параметров.
  1. Работа со структурой.
  1. Инициация редактора предобработчика.
  1. Обработка ошибок.

Поскольку нейрокомпьютер может работать одновременно с несколькими сетями, то и компонент предобработчик должна иметь возможность одновременной работы с несколькими предобработчиками. Поэтому большинство запросов к предобработчику содержат явное указание имени предобработчика. Ниже приведено описание всех запросов к компоненту предобработчик. Каждый запрос является логической функцией, возвращающей значение истина, если запрос выполнен успешно, и ложь – при ошибочном завершении исполнения запроса.

В запросах второй и третьей группы при обращении к частным интерпретаторам используется следующий синтаксис:

<Полное имя частного интерпретатора> ::= <Имя интерпретатора>.

<Псевдоним частного интерпретатора> [[<Номер экземпляра>]]

При вызове ряда запросов используются предопределенные константы. Их значения приведены в табл. 23.

Таблица 23.

Значения предопределенных констант компонента предобработчик

Название Значение Значение
BinaryPrep 0 Стандартный предобработчик бинарных признаков
UnOrdered 1 Стандартный предобработчик неупорядоченных качественных признаков
Ordered 2 Стандартный предобработчик упорядоченных качественных признаков.
EmptyPrep 3 Стандартный простейший предобработчик
ModPrep 4 Стандартный модулярный предобработчик
FuncPrep 5 Стандартный функциональный предобработчик
PositPrep 6 Стандартный позиционный предобработчик
UserType -1 Предобработчик, определенный пользователем.

Запрос на предобработку

Единственный запрос первой группы выполняет основную функцию компонента предобработчик – предобрабатывает входные данные, вычисляя вектор входных сигналов.

Предобработать вектор сигналов (Prepare)

Описание запроса:

Pascal:

Function Prepare(CompName : PString; Data : PRealArray; Var Signals : PRealArray) : Logic;

C:

Logic Prepare(PString CompName, PRealArray Data; PRealArray* Signals)

Описание аргумента:

CompName – указатель на строку символов, содержащую имя предобработчика.

Data – массив входных данных.

Signals – вычисляемый массив входных сигналов.

Назначение – предобрабатывает массив входных данных Data, вычисляя массив входных сигналов Signals используя предобработчик, указанный в параметре CompName.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента CompName дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является текущий предобработчик – первый в списке предобработчиков компонента предобработчик.
  1. Если список предобработчиков компонента предобработчик пуст или имя предобработчика, переданное в аргументе CompName в этом списке не найдено, то возникает ошибка 201 – неверное имя предобработчика, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Производится предобработка предобработчиком, имя которого было указано в аргументе CompName.
  1. Если во время выполнения запроса возникает ошибка, то генерируется внутренняя ошибка 204 - ошибка предобработки. Управление передается обработчику ошибок. Выполнение запроса прекращается. В противном случае выполнение запроса успешно завершается.

Остальные запросы

Ниже приведен список запросов к компоненту предобработчик, исполнение которых описано в разделе «Общий стандарт»:

prSetCurrent – Сделать предобработчик текущим

prAdd – Добавление нового предобработчика

prDelete – Удаление предобработчика

prWrite – Запись предобработчика

prGetStructNames – Вернуть имена структурных единиц предобработчика

prGetType – Вернуть тип структурной единицы предобработчика

prGetData – Получить параметры предобработчика

prGetName – Получить имена параметров предобработчика

prSetData – Установить параметры предобработчика

prEdit – Редактировать предобработчик

OnError – Установить обработчик ошибок

GetError – Дать номер ошибки

FreeMemory – Освободить память

В запросе prGetType  в переменной TypeId возвращается значение одной из предопределенных констант, перечисленных в табл. 23.

Ошибки компонента предобработчик

В табл. 24 приведен полный список ошибок, которые могут возникать при выполнении запросов компонентом предобработчик, и действия стандартного обработчика ошибок.

Таблица 24.

Ошибки компонента предобработчик и действия стандартного обработчика ошибок.

Название ошибки Стандартная обработка
201 Неверное имя предобработчика Занесение номера в Error
202 Ошибка считывания предобработчика Занесение номера в Error
203 Ошибка сохранения предобработчика Занесение номера в Error
204 Ошибка предобработки Занесение номера в Error

Стандарт первого уровня компонента сеть

Данный раздел посвящен описанию стандарта хранения компонента сеть на внешних носителях.

Структура компонента

Рассмотрим более подробно структуры данных сети. Как уже было описано ранее, сеть строится иерархически от простых подсетей к сложным. Простейшими подсетями являются элементы. Подсеть каждого уровня имеет свое имя и тип. Существуют следующие типы подсетей: элемент, каскад, слой, цикл с фиксированным числом тактов функционирования и цикл, функционирующий до тех пор, пока не выполнится некоторое условие. Последние четыре типа подсетей будем называть блоками. Имена подсетей определяются при конструировании. В разделе «Имена структурных единиц компонентов» приведены правила построения полного и однозначного имен подсети. В качестве примера рассмотрим сеть, конструирование которой проиллюстрировано в главе «Описание нейронных сетей» на рис. 2. В описании сети NW однозначное имя первого нейрона второго слоя имеет вид K[2].SN.N[1]. При описании слоя однозначное имя первого нейрона записывается как N[1]. В квадратных скобках указываются номер экземпляра подсети, входящей в непосредственно содержащую ее структуру в нескольких экземплярах.

Сигналы и параметры

При использовании контрастирования для изменения структуры сети и значений обучаемых параметров другим компонентам бывает необходим прямой доступ к сигналам и параметрам сети в целом или отдельных ее подсетей. Для адресации входных и выходных сигналов используются имена InSignals и OutSignals, соответственно. Таким образом, для получения массива входных сигналов второго слоя сети, приведенной на рис. 2, необходимо запросить массив NW.K[2].InSignals, а для получения выходного сигнала всей сети можно воспользоваться любым из следующего списка имен:

  • NW.OutSignals;
  • NW.N.OutSignals.

Для получения конкретного сигнала из массива сигналов необходимо в конце в квадратных скобках указать номер сигнала. Например, для получения третьего входного сигнала второго слоя сети нужно указать следующее имя – NW.K[2].InSignals[3].

Для получения доступа к параметрам нужно указать имя подсети, к чьим параметрам нужен доступ и через точку ключевое слово Parameters. При необходимости получить конкретный параметр, его номер в квадратных скобках записывается после ключевого слова Parameters.

Обучаемые и не обучаемые параметры и сигналы

При обучении параметров и сигналов (использование обучения сигналов описано во введении) возникает необходимость обучать только часть из них. Так, например, при описании обучения персептрона во второй части главы «Описание нейронных сетей» было отмечено, что обучать необходимо только  веса связей второго слоя. Для реализации этой возможности используются два массива логических перемен-ных – маска обучаемых параметров и маска обучаемых входных сигналов.

Дополнительные переменные

При описании структуры сетей необходимо учитывать следующую дополнительные переменные, доступные в методах Forw и Back. Для каждой сети при прямом функционировании определен следующий набор переменных:

  • InSignals[K] – массив из K действительных чисел, содержащих входные сигналы прямого функционирования.
  • OutSignals[N] – массив из N действительных чисел, в которые заносятся выходные сигналы прямого функционирования.
  • Parameters[M] – массив из M действительных чисел, содержащих параметры сети.

При выполнении обратного функционирования сети доступны еще три массива:

  • Back.InSignals[K] – массив из K действительных чисел, параллельный массиву InSignals, в который заносятся выходные сигналы обратного функционирования.
  • Back.OutSignals[N] – массив из N действительных чисел,  параллельный массиву OutSignals, содержащий входные сигналы обратного функционирования.
  • Back.Parameters[M] – массив из M действительных чисел, параллельный массиву Parameters, в который заносятся вычисленные при обратном функционировании поправки к параметрам сети.

При обучении (модификации параметров или входных сигналов) доступны все переменные обратного функционирования и еще два массива:

  • InSignalMask[K] – массив из K логических переменных, параллельный массиву InSignals, содержащий маску обучаемости входных сигналов.
  • ParamMask[M] – массив из M логических переменных, параллельный массиву Parameters, содержащий маску обучаемости параметров.

Стандарт языка описания сетей

Язык описания нейронных сетей предназначен для хранения сетей на диске. Следует отметить, что в отличии от таких компонентов, как предобработчик входных сигналов, оценка или задачник описание даже простой сети имеет большой размер. С другой стороны, многие подсети являются стандартными для большинства сетей. Для компонента сеть нет смысла вводить небольшой набор стандартных элементов и подсетей, поскольку этот набор может легко расширяться. Более эффективным является выделение часто употребляемых подсетей в отдельные библиотеки, подключаемые к описаниям конкретных сетей. В приведенных в этом разделе примерах описания нейронных сетей выделен ряд библиотек.

Ключевые слова языка

В табл. 25 приведен список ключевых слов специфических для языка описания сетей.

Таблица 25.

Ключевые слова языка описания сетей.

Идентификатор Краткое описание
Back Метод, осуществляющий обратное функционирование подсети. Префикс сигналов обратного функционирования.
Block Тип аргумента подсети. Означает, что аргумент является подсетью.
Cascad Тип подсети – каскад.
Connections Начало блока описания связей подсети.
Contents Начало блока описания состава подсети.
DefaultType Тип параметров по умолчанию.
Element Тип подсети – элемент.
Forw Метод, осуществляющий прямое функционирования подсети.
InSignalMask Имя, по которому адресуются маски обучаемости входных сигналов подсети.
InSignals Имя, по которому адресуются входные сигналы подсети; начало блока описания входных сигналов.
Layer Тип подсети – слой.
Loop Тип подсети – цикл, выполняемый указанное число раз.
MainNet Начало описания главной сети
NetLib Начало описания библиотеки подсетей.
NetWork Начало описания сети
NumberOf Функция (запрос). Возвращает число параметров или сигналов в подсети.
OutSignals Имя, по которому адресуются выходные сигналы подсети; начало блока описания выходных сигналов.
ParamDef Заголовок определения типа параметров.
Ðarameters Имя, по которому адресуются параметры подсети; начало блока описания параметров.
ParamMask Имя, по которому адресуются маски обучаемости параметров подсети.
ParamType Заголовок описания типа параметров.
Until Тип подсети – цикл, выполняемый до тех пор пока не выполнится условие.
Used Начало списка подключаемых библиотек подсетей

БНФ языка описания сетей

Обозначения, принятые в данном расширении БНФ и описание ряда конструкций приведены в разделе «Описание языка описания компонентов».

<Описание библиотеки подсетей> ::= <Заголовок библиотеки> <Описание подсетей> <Конец описания библиотеки>

<Заголовок библиотеки> ::= NetLib <Имя библиотеки> [Used <Список имен библиотек>]

<Имя библиотеки> ::= <Идентификатор>

<Список имен библиотек> ::= <Имя используемой библиотеки> [,<Список имен библиотек>]

<Имя используемой библиотеки> ::= <Идентификатор>

<Описание подсетей> ::= <Описание подсети> [<Описание подсетей>]

<Описание подсети> ::= {<Описание элемента> | <Описание блока> | <Описание функций>}

<Описание элемента> ::= <Заголовок описания элемента> <Описание сигналов и параметров> [<Описание типов параметров>] [<Определение типов параметров>] [<Описание статических переменных>] [<Установление значений статических переменных>] <Описание методов> <Конец описания элемента>

<Заголовок описания элемента> ::= Element <Имя элемента> [(<Список формальных аргументов>)]

<Имя элемента> ::= <Идентификатор>

<Описание сигналов и параметров> ::= <Описание входных сигналов> <Описание выходных сигналов> [<Описание параметров>]

<Описание входных сигналов> ::= InSignals <Константное выражение типа Long>

<Описание выходных сигналов> ::= OutSignals <Константное выражение типа Long>

<Описание параметров> ::= Parameters <Константное выражение типа Long>

<Описание типов параметров> ::= <Описание типа параметров> [<Описание типов параметров>]

<Описание типа параметров> ::= ParamType <Имя типа параметра> <Список>

<Имя типа параметра> ::= <Идентификатор>

<Список> ::= {Parameters[<Начальный номер> [..<Конечный номер> [<Шаг>]]] | InSignals[<Начальный номер> [..<Конечный номер> [<Шаг>]]]} [;<Список>]

<Определение типов параметров> ::= <Определение типа параметра> [<Определение типов параметров>]

<Определение типа параметра> ::= ParamDef <Имя типа параметра> <Минимальное значение> <Максимальное значение>

<Минимальное значение> ::= <Константное выражение типа Real>

<Максимальное значение> ::= <Константное выражение типа Real>

<Установление значений статических переменных> ::= <Установление параметров Подсети> [;<Установление значений статических переменных>]

<Описание методов> ::= <Описание функционирования вперед> <Описание функционирования назад>

<Описание функционирования вперед> ::= Forw [<Описание переменных>] <Тело метода>

<Тело метода> ::= Begin <Составной оператор> End

<Описание функционирования назад> ::= Back [<Описание переменных>] <Тело метода>

<Конец описания элемента> ::= End <Имя элемента>

<Описание блока> ::= <Заголовок описания блока> <Описание состава> <Описание сигналов и параметров> [<Описание статических переменных>] [<Установление значений статических переменных>] <Описание связей> [<Определение типов параметров>] <Конец описания блока>

<Заголовок описания блока> ::= {<Описание каскада> | <Описание слоя> | <Описание цикла с фиксированным числом шагов> | <Описание цикла по условию>}

<Описание каскада> ::= Cascad <Имя блока> [(<Список формальных аргументов блока>)]

<Имя блока> ::= <Идентификатор>

<Список формальных аргументов блока> ::= {<Список формальных аргументов> | <Аргумент – подсеть>} [;<Список формальных аргументов блока>]

<Аргумент – подсеть>::= <Список имен аргументов – подсетей> : Block

<Список имен аргументов – подсетей> ::= <Имя аргумента – подсети> [,<Список имен аргументов – подсетей>]

<Имя аргумента – подсети> ::= <Идентификатор>

<Описание слоя> ::= Layer <Имя блока> [(<Список формальных аргументов блока>)]

<Описание цикла с фиксированным числом шагов> ::= Loop <Имя блока> [(<Список формальных аргументов блока>)] <Число повторов цикла>

<Число повторов цикла> ::= <Константное выражение типа Long>

<Описание цикла по условию> ::= Until <Имя блока> [(<Список формальных аргументов блока>)] : <Выражение типа Logic>

<Описание состава> ::= Contents <Список имен подсетей>

<Список имен подсетей> ::= <Имя подсети> [,<Список имен подсетей>]

<Имя подсети> ::= <Псевдоним>: {<Имя ранее описанной подсети> [(<Список фактических аргументов блока>)] [[<Число экземпляров>]] | <Имя аргумента – подсети> [[<Число экземпляров >]]}

<Псевдоним> ::= <Идентификатор>

<Число экземпляров > ::= <Константное выражение типа Long>

<Имя ранее описанной подсети> ::= <Идентификатор>

<Список фактических аргументов блока> ::= <Фактический аргумент блока> [,<Список фактических аргументов блока>]

<Фактический аргумент блока> ::= {<Фактический аргумент> | <Имя аргумента – подсети>}

<Описание связей> ::= {<Описание распределения Входных сигналов, Блока, Подсети, InSignals > | <Описание распределения Выходных сигналов, Блока, Подсети, OutSignals > | <Описание распределения Параметров, Блока, Подсети, Parameters >}

<Конец описания блока>::= End <Имя блока>

<Конец описания библиотеки> ::= End NetLib

<Описание сети> ::= <Заголовок описания сети> <Описание подсетей> <Описание главной сети> <Массивы параметров и масок сети> <Конец описания сети>

<Заголовок описания сети> ::= NetWork <Имя сети> [Used <Список имен библиотек>]

<Имя сети> ::= <Идентификатор>

<Описание главной сети> ::= MainNet <Имя ранее описанной подсети> [(<Список фактических аргументов блока>)]

<Массивы параметров и масок сети> ::= <Массив параметров> <Массив маски обучаемости параметров>

<Массив параметров> ::= Parameters <Значения параметров>;

<Значения параметров> ::= <Действительное число> [, <Значения параметров>]

<Массив маски обучаемости параметров> ::= ParamMask <Значения маски>;

<Значения маски> ::= <Константа типа Logic> [,<Значения маски>]

<Конец описания сети> ::= End NetWork

Описание языка описания сетей

В этом разделе приводится детальное описание языка описания сетей, дополняющее БНФ, приведенную в предыдущем разделе и описание общих конструкций, приведенное в разделе «Общий стандарт».

Описание и область действия переменных

Вспомогательные переменные могут потребоваться при описании прямого и обратного функционирования элементов. Переменная действует только в пределах той процедуры, в которой она описана. Кроме явно описанных переменных, в методе Forw доступны также сигналы прямого функционирования и параметры элемента, а в методе Back – входные и выходные сигналы прямого функционирования, выходные сигналы обратного функционирования, параметры элемента и градиент по параметрам элемента. Во всех методах доступны аргументы элемента.

Статические переменные, описываемые после ключевого слова Static, уникальны для каждого экземпляра элемента или блока, и доступны только в пределах блока. Эти переменные могут потребоваться для вычисления условий в цикле типа Until. Возможно использование таких переменных в элементах, например, для хранения предыдущего состояния элемента. Кроме того, в статической переменной можно хранить значения не обучаемых параметров.

Методы Forw и Back для блоков

Методы Forw и Back для блоков не описываются в языке описания сетей. Это связано с тем, что при выполнении метода Forw блоком происходит вызов метода Forw составляющих блок подсетей (для элементов – метода Forw) в порядке их описания в разделе описания состава блока. При выполнении метода Back происходит вызов методов Back составляющих блок подсетей в порядке обратном порядку их описания в разделе описания состава блока.

Описание элементов

Описание элемента состоит из следующих основных разделов: заголовка элемента, описания сигналов и параметров, описания статических переменных и описания методов. Заголовок элемента имеет следующий синтаксис:

Element Имя_Элемента (Аргументы элемента)

Аргументы элемента являются необязательной частью заголовка. В следующем разделе приведены описания нескольких элементов. Отметим, что сигмоидный элемент описан двумя способами: с принципиально не обучаемой (S_NotTrain) и с обучаемой (S_Train) характеристикой.

Раздел описания сигналов и параметров следует сразу после заголовка элемента и состоит из указания числа входных и выходных сигналов и числа параметров элемента. Если у элемента отсутствуют параметры, то указание числа параметров можно опустить. В следующем разделе приведены элементы как имеющие параметры (S_Train, Adaptiv_Sum, Square_Sum), так и элементы без параметров (Sum, S_NotTrain, Branch). Концом раздела описания сигналов и параметров служит одно из ключевых слов ParamType, ParamDef, Forw или Back.

Описание типов параметров является необязательной частью описания элемента и начинается с ключевого слова ParamType. Если раздел описания типов параметров отсутствует, то все параметры этого элемента считаются параметрами типа DefaultType. Если в сети должны присутствовать параметры разных типов (например с разными ограничениями на минимальное и максимальное значение) необходимо описать типы параметров. Концом этого раздела служит одно из ключевых слов ParamDef, Forw или Back.

Раздел определения типов параметров является необязательным разделом в описании элемента и начинается с ключевого слова ParamDef. В каждой строке этого раздела можно задать минимальную и масимальную границы изменения одного типа параметров. Если в описании сети встречаются параметры неопределенного типа то этот тип считается совпадающим с типом DefaultType. Описание типа не обязано предшествовать описанию параметров этого типа. Так например, определение типа параметров может находиться в описании главной сети. Концом этого раздела служит одно из ключевых слов Forw или Back.

Раздел описания методов состоит из описания двух методов: Forw и Back. Описание метода состоит из заголовка, раздела описания переменных и тела метода. Заголовок имеет вид ключевого слова Forw или Back для соответствующего метода. Раздел описания переменных состоит из ключевого слова Var, за которым следуют описания однотипных переменных, каждое из которых заканчивается символом «;». Необходимо понимать, что описание заголовков методов это не описание заголовка (прототипа) функции, выполняющей тело метода. Ниже приведен синтаксис заголовков методов Forw и Back на момент вызова:

Pascal:

Procedure Forw( InSignals, OutSignals, Parameters : PRealArray);

Procedure Back(InSignals, OutSignals, Parameters, Back.InSignals, Back.OutSignals, Back.Parameters : PRealArray);

C

void Forw(PRealArray InSignals, PRealArray OutSignals, PRealArray Parameters)

void Back(PRealArray InSignals, PRealArray OutSignals, PRealArray Parameters,

PRealArray Back.InSignals, PRealArray Back.OutSignals, PRealArray Back.Parameters)

В методе Forw в левой части оператора присваивания могут фигурировать имена любых переменных и элементов предопределенного массива выходных сигналов (OutSignals). В выражении, стоящем в правой части оператора присваивания могут участвовать любые переменные, аргументы элемента и элементы предопределенных массивов входных сигналов (InSignals) и параметров (Parameters).

В методе Back в левой части оператора присваивания могут фигурировать имена любых переменных, элементов предопределенных массивов входных сигналов обратного функционирования (Back.InSignals) и параметров (Back.Parameters). В выражении, стоящем в правой части оператора присваивания, могут участвовать любые переменные, аргументы элемента и элементы предопределенных массивов входных (InSignals) и выходных (OutSignals) сигналов и параметров (Parameters).Отметим важную особенность вычисления поправок к параметрам. Поскольку один и тот же параметр может использоваться несколькими элементами, при вычислении поправки к параметру вычисленное значение нужно не присваивать соответствующему элементу массива Back.Parameters, а добавлять. При этом в теле метода элементы массива Back.Parameters не могут фигурировать в правой части оператора присваивания. Эта особенность вычисления поправок к параметрам обрабатывается компонентом сеть.

Описание элемента завершается ключевым словом End за которым следует имя элемента.

Пример описания элементов

NetBibl Elements;                                     {Библиотека элементов}

Element Synaps                                         {Обычный синапс}

      InSignals 1                                           {Один входной сигнал}

      OutSignals 1                                       {Один выходной сигнал}

      Parameters 1                                 {Один параметр – вес связи}

      Forw                                                      {Начало описания прямого функционирования}

      Begin                                                    {Выходной сигнал – произведение входного сигнала на параметр}

             OutSignals[1] = InSignals[1] * Parameters[1]

      End                                                               {Конец описания прямого функционирования}

      Back                                                            {Начало описания обратного функционирования }

      Begin        {Поправка к входному сигналу – произведение поправки к выходному сигналу на параметр}

             Back.InSignals[1] = Back.OutSignals[1] * Parameters[1];

{Поправка к параметру – сумма ранее вычисленной поправки к параметру на произведение поправки к обратному сигналу на входной сигнал}

             Back.Parameters[1] = Back.Parameters[1] + Back.OutSignals[1] * InSignals[1]

      End                                                         {Конец описания обратного функционирования}

End Synaps                                                 {Конец описания синапса}

Element Branch(N : Long)                       {Точка ветвления на N выходных сигналов}

      InSignals 1                                           {Один входной сигнал}

      OutSignals N                                      {N выходных сигналов}

      Forw                                                      {Начало описания прямого функционирования}

             Var Long I;                                    {I – длинное целое – индекс}

      Begin

             For I=1 To N Do                      {На каждый из N выходных сигналов передаем }

                   OutSignals[I] = InSignals[1]     {входной сигнал}

      End                                                               {Конец описания прямого функционирования}

      Back                                                            {Начало описания обратного функционирования }

             Var                                                        {Описание локальных переменных}

                   Long I;                                            {I – длинное целое – индекс}

                   Real R;                                            {R – действительное – для накопления суммы}

      Begin

             R = 0;

             For I=1 To N Do                      {Поправка ко входному сигналу равна сумме }

                   R = R + Back.OutSignals[I];      {поправок выходных сигналов}

             Back. InSignals[1] = R

      End                                                               {Конец описания обратного функционирования}

End Branch                                                        {Конец описания точки ветвления}

Element Sum(N Long)                        {Простой сумматор на N входов}

      InSignals N                                   {N входных сигналов}

      OutSignals 1                                 {Один выходной сигнал}

      Forw                                                {Начало описания прямого функционирования}

             Var                                            {Описание локальных переменных}

                   Long I;                               {I – длинное целое – индекс}

                   Real R;                               {R – действительное – для накопления суммы}

      Begin

             R = 0;

             For I=1 To N Do                {Выходной сигнал равен сумме входных}

                   R = R + InSignals[I];

             OutSignals[1] = R

      End                                                         {Конец описания прямого функционирования}

      Back                                                      {Начало описания обратного функционирования}

             Var Long I;                                    {I – длинное целое – индекс}

      Begin

             For I=1 To N Do                      {Поправка к каждому входному сигналу равна }

                   Back.InSignals[I] = Back.OutSignals[1]   { поправке выходного сигнала}

      End                                                         {Конец описания обратного функционирования}

End Sum                                                      {Конец описания простого сумматора}

Element Mul                                               {Умножитель}

      InSignals 2                                           {Два входных сигнала}

      OutSignals 1                                       {Один выходной сигнал}

      Forw                                                      {Начало описания прямого функционирования }

      Begin

             OutSignals[1] = InSignals[1] * InSignals[2]   {Выходной сигнал равен произведению входных сигналов}

      End                                                               {Конец описания прямого функционирования}

      Back                                                            {Начало описания обратного функционирования }

      Begin

{Поправка к каждому входному сигналу равна произведению поправки выходного сигнала на другой входной сигнал}

             Back.InSignals[1] = Back.OutSignals[1] * InSignals[2];

             Back.InSignals[2] = Back.OutSignals[1] * InSignals[1]

      End                                                         {Конец описания обратного функционирования}

End Mul                                                       {Конец описания умножителя}

Element S_Train                                  {Обучаемый гиперболический сигмоидный элемент}

      InSignals 1                                           {Один входной сигнал}

      OutSignals 1                                       {Один выходной сигнал}

      Parameters 1                                 {Один параметр – характеристика}

      Forw                                                      {Начало описания прямого функционирования}

      Begin

{Выходной сигнал равен отношению входного сигнала к сумме параметра и абсолютной величины входного сигнала}

             OutSignals[1] = InSignals[1] / (Parameters[1] + Abs(InSignals[1])

      End                                                         {Конец описания прямого функционирования}

      Back                                                      {Начало описания обратного функционирования}

             Var Real R;                                    {R – действительное}

      Begin

{R – вспомогательная величина для вычисления поправок, равная отношению поправки выходного сигнала к квадрату суммы параметра и абсолютной величины входного сигнала}

             R = Back.OutSignals[1] / Sqr(Parameters[1] + Abs(InSignals[1]);

{Поправка к входному сигналу равна произведению вспомогательной величины на параметр}

             Back.InSignals[1] = R * Parameters[1];

{Поправка к параметру равна сумме ранее вычисленной величины поправки и произведения вспомогательной величины на входной сигнал}

             Back.Parameters[1] = Back.Parameters[1] + R * InSignals[1]

      End                                                               {Конец описания обратного функционирования}

End S_Train    {Конец описания обучаемого гиперболического сигмоидного элемента}

Element S_NotTrain( Char : Real){Не обучаемый гиперболический сигмоидный элемент Char – характеристика}

      InSignals 1                                    {Один входной сигнал}

      OutSignals 1                                 {Один выходной сигнал}

      Forw                                                {Начало описания прямого функционирования}

      Begin

{Выходной сигнал равен отношению входного сигнала к сумме характеристики и абсолютной величины входного сигнала}

             OutSignals[1] = InSignals[1] / (Char + Abs(InSignals[1])

      End                                                  {Конец описания прямого функционирования}

      Back                                               {Начало описания обратного функционирования}

      Begin

{Поправка к входному сигналу равна отношению произведения поправки выходного сигнала на характеристику к квадрату суммы характеристики и абсолютной величины входного сигнала}

             Back.InSignals[1] = Back.OutSignals[1] * Char / Sqr(Char + Abs(InSignals[1]);

      End                                                         {Конец описания обратного функционирования}

End S_NotTrain                                         {Конец описания гиперболического сигмоидного элемента}

Element Pade(Char : Real)                 {Паде преобразователь Char  – характеристика}

      InSignals 2                                           {Два входных сигнала}

      OutSignals 1                                       {Один выходной сигнал}

      Forw                                                      {Начало описания прямого функционирования}

      Begin

{Выходной сигнал равен отношению первого входного сигнала к сумме характеристики и второго входного сигнала}

             OutSignals[1] = InSignals[1] / (Char+ InSignals[2])

      End                                                         {Конец описания прямого функционирования}

      Back                                                      {Начало описания обратного функционирования}

             Var Real R;                                    {R – действительное}

      Begin

{Вспомогательная величина равна поправке к первому входному сигналу – отношению поправки выходного сигнала к сумме характеристики и второго входного сигнала}

             R = Back.OutSignals[1] / (Char + InSignals[2]);

             Back.InSignals[1] = R;

{Поправка ко второму входному сигналу равна минус отношению произведения первого входного сигнала на поправку выходного сигнала к квадрату суммы характеристики и второго входного сигнала}

             Back.InSignals[2] =  -R * OutSignals[1];

      End                                                         {Конец описания обратного функционирования}

End Pade                                                     {Конец описания Паде преобразователя}

Element Sign_Mirror                          {Зеркальный пороговый элемент}

      InSignals 1                                           {Один входной сигнал}

      OutSignals 1                                       {Один выходной сигнал}

      Forw                                                      {Начало описания прямого функционирования }

      Begin

             If InSignals[1] > 0   Then OutSignals[1] = 1 {Выходной сигнал равен 1, если входной сигнал }

                                                   Else OutSignals[1] = 0          {больше нуля, и нулю в противном случае}

      End                                                         {Конец описания прямого функционирования}

      Back                                                     {Начало описания обратного функционирования}

      Begin

             Back.InSignals[1] = OutSignals[1]; {Поправка к входному сигналу равна выходному сигналу}

      End                                                         {Конец описания обратного функционирования}

End Sign_Mirror                                  {Конец описания зеркального порогового элемента}

Element Sign_ Easy                                  {Прозрачный  пороговый элемент}

      InSignals 1                                           {Один входной сигнал}

      OutSignals 1                                       {Один выходной сигнал}

      Forw                                                      {Начало описания прямого функционирования }

      Begin

             If InSignals[1] > 0   Then OutSignals[1] = 1 {Выходной сигнал равен 1, если входной сигнал больше }

                                                   Else OutSignals[1] = 0          {нуля, и нулю в противном случае}

      End                                                         {Конец описания прямого функционирования}

      Back                                                      {Начало описания обратного функционирования}

      Begin

                         {Поправка к входному сигналу равна поправке к выходному сигналу}

             Back.InSignals[1] = Back.OutSignals[1];

      End                                                         {Конец описания обратного функционирования}

End Sign_Easy                                           {Конец описания прозрачного порогового элемента}

Element Adaptiv_Sum( N : Long)          {Адаптивный сумматор на N входов}

      InSignals N                                          {N входных сигналов}

      OutSignals 1                                       {Один выходной сигнал}

      Parameters N                                      {N параметров – весов связей}

      Forw                                                      {Начало описания прямого функционирования}

             Var                                                  {Описание локальных переменных}

                   Long I;                                      {I – длинное целое – индекс}

                   Real R;                                     {R – действительное – для накопления суммы}

      Begin

             R = 0;                                               {Выходной сигнал равен скалярному }

             For I=1 To N Do                      {произведению массива входных сигналов}

                   R = R + InSignals[I] * Parameters[I];   {на массив параметров}

             OutSignals[1] = R

      End                                                         {Конец описания обратного функционирования}

      Back                                                      {Начало описания обратного функционирования}

             Var Long I;                                    {I – длинное целое – индекс}

      Begin

             For I=1 To N Do Begin

{Поправка к I-у входному сигналу равна сумме ранее вычисленной поправки и произведения поправки выходного сигнала на I-й параметр}

                   Back.InSignals[I] = Back.OutSignals[1] * Parameters[I];

{Поправка к I-у параметру равна произведению поправки выходного сигнала на I-й входной сигнал}

                   Back. Parameters[I] = Back. Parameters[I] + Back.OutSignals[1] * InSignals[I]

             End

      End                                                               {Конец описания обратного функционирования}

End Adaptiv_Sum                                            {Конец описания адаптивного сумматора}

Element Adaptiv_Sum_Plus ( N : Long)      {Адаптивный неоднородный сумматор на N входов}

      InSignals N                                                {N входных сигналов}

      OutSignals 1                                              {Один выходной сигнал}

      Parameters N+1                                        {N+1 параметр – веса связей}

      Forw                                                             {Начало описания прямого функционирования}

             Var                                                        {Описание локальных переменных}

                   Long I;                                            {I – длинное целое – индекс}

                   Real R;                                            {R – действительное – для накопления суммы}

      Begin

             R = Parameters[N+1];                        {Выходной сигнал равен сумме N+1 параметра}

             For I=1 To N Do                            {и скалярного произведения массива входных}

                   R = R + InSignals[I] * Parameters[I];   {сигналов на массив параметров}

             OutSignals[1] = R

      End                                                               {Конец описания прямого функционирования}

      Back                                                            {Начало описания обратного функционирования }

             Var Long I;                                          {I – длинное целое – индекс }

      Begin

             For I=1 To N Do Begin

{Поправка к I-у входному сигналу равна произведению поправки выходного сигнала на I-й параметр}

                   Back.InSignals[I] = Back.OutSignals[1] * Parameters[I];

{Поправка к I-у параметру равна сумме ранее вычисленной поправки и произведения поправки выходного сигнала на I-й входной сигнал}

                   Back. Parameters[I] = Back. Parameters[I] + Back.OutSignals[1] * InSignals[I]

             End;

{Поправка к (N+1)-у параметру равна сумме ранее вычисленной поправки и попраки к выходному сигналу}

             Back.Parameters[N+1] = Back.Parameters[N+1] + Back.OutSignals[1]

      End                                                               {Конец описания обратного функционирования}

End Adaptiv_Sum_Plus                                  {Конец описания неоднородного адаптивного сумматора}

Element Square_Sum( N : Long)                   {Квадратичный сумматор на N входов}

      InSignals N                                                {N входных сигналов}

      OutSignals 1                                              {Один выходной сигнал}

      Parameters (Sqr(N) + N) Div 2         {N(N+1)/2 параметров – весов связей}

      Forw                                                             {Начало описания прямого функционирования}

             Var                                                        {Описание локальных переменных}

                   Long I,J,K;                                     {I,J,K – переменные типа длинное целое }

                   Real R;                                            {R – действительное – для накопления суммы}

      Begin

             K = 1;                                                     {K – номер обрабатываемого параметра}

             R = 0;

             For I = 1 To N Do                          {I,J – номера входных сигналов}

                   For J = I To N Do Begin

                         R = R + InSignals[I] * InSignals[J] * Parameters[K];

                         K = K + 1

                   End;

{Выходной сигнал равен сумме всех попарных произведений входных сигналов, умноженных на соответствующие параметры}

             OutSignals[1] = R

      End                                                               {Конец описания прямого функционирования}

      Back                                                            {Начало описания обратного функционирования }

             Var                                                        {Описание локальных переменных}

                   Long I, J, K;                                   {I,J,K – переменные типа длинное целое }

                   Real R;                                            {R – действительное}

                   Vector W;                                      {Массив для накопления промежуточных величин}

      Begin

             For I = 1 To N Do

                   W[I] = 0;

             K = 1;                                              {K – номер обрабатываемого параметра}

             For I = 1 To N Do

                   For J = I To N Do Begin

{Поправка к параметру равна сумме ранее вычисленной поправки и произведения поправки к входному сигналу на произведение сигналов, прошедших через этот параметр при прямом функционировании}

                         Back.Parameters[K] = Back.Parameters[K] + Back.OutSignals[1] * InSignals[I] * InSignals[J];

                         R = Back.OutSignals[1] * Parameters[K];

                         W[I] = W[I] + R * InSignals[J];

                         W[J] = W[J] + R * InSignals[I];

                         K = K + 1

                   End;

             For I = 1 To N Do

{Поправка к входному сигналу равна произведению поправки к выходному сигналу на сумму всех параметров, через которые этот сигнал проходил при прямом функционировании, умноженных на другие входные сигналы, так же прошедшие через эти параметры при прямом функционировании}

                   Back.InSignals[1] = W[I]

      End                                                               {Конец описания прямого функционирования}

End Square_Sum                                        {Конец описания квадратичного сумматора}

Element Square_Sum_Plus( N : Long)   {Неоднородный квадратичный сумматор на N входов}

      InSignals N                                                {N входных сигналов}

      OutSignals 1                                              {Один выходной сигнал}

      Parameters (Sqr(N) + 3 * N) Div 2 + 1         {N(N+3)/2+1 весов связей}

      Forw                                                             {Начало описания прямого функционирования}

             Var                                                        {Описание локальных переменных}

                   Long I, J, K;                                   {I,J,K – переменные типа длинное целое }

                   Real R;                                            {R – действительное – для накопления суммы}

      Begin

             K = 2 * N+1;                                   {K – номер обрабатываемого параметра}

             R = Parameters[Sqr(N) + 3 * N) Div 2 + 1];

             For I = 1 To N Do Begin

                   R = R + InSignals[I] * Parameters[I] + Sqr(InSignals[I]) * Parameters[N + I];

                   For J = I + 1 To N Do Begin

                         R = R + InSignals[I] * InSignals[J] * Parameters[K];

                         K = K + 1

                   End

             End

{Выходной сигнал равен сумме всех попарных произведений входных сигналов, умноженных на соответствующие параметры, плюс сумме всех входных сигналов умноженных на соответствующие параметры, плюс последний параметр}

             OutSignals[1] = R

      End                                                               {Конец описания прямого функционирования}

      Back                                                            {Начало описания обратного функционирования }

             Var                                                        {Описание локальных переменных}

                   Long I, J, K;                                   {I,J,K – переменные типа длинное целое }

                   Real R;                                            {R – действительное – для накопления суммы}

                   Vector W;                                      {Массив для накопления промежуточных величин}

      Begin

             For I = 1 To N Do

                   W[I] = 0;

             K = 2 * N + 1;                                 {K – номер обрабатываемого параметра}

             For I = 1 To N Do Begin

                   Back.Parameters[I] = Back.Parameters[I] + Back.OutSignals[1] * InSignals[I];

                   Back.Parameters[N + I] = Back.Parameters[N + I] + Back.OutSignals[1] * Sqr(InSignals[I]);

                   W[I] = W[I] + Back.OutSignals[1] * (Parameters[I] + 2 * Parameters[N + I] * InSignals[I])

                   For J = I + 1 To N Do Begin

                         Back.Parameters[K] = Back.Parameters[K] + Back.OutSignals[1] * InSignals[I] * InSignals[J];

                         R = Back.OutSignals[1] * Parameters[K];

                         W[I] = W[I] + R * InSignals[J];

                         W[J] = W[J] + R * InSignals[I];

                         K = K + 1

                   End

             End;

             For I = 1 To N Do

                   Back.InSignals[1] = W[I]

      End                                                         {Конец описания обратного функционирования}

End Square_Sum_Plus                              {Конец описания адаптивного квадратичного сумматора}

End NetBibl

Описание блоков

Описание блока состоит из пяти основных разделов: заголовка описания блока, описания сигналов и параметров, описания состава, описания связей и конца описания блока. Существует два типа блоков – каскад и слой (Layer). Различие между этими двумя типами блоков состоит в том, что подсети, входящие в состав слоя, функционируют параллельно и независимо друг от друга, тогда как составляющие каскад подсети функционируют последовательно, причем каждая следующая подсеть использует результаты работы предыдущих подсетей. В свою очередь существует три вида каскадов – простой каскад (Cascad), цикл с фиксированным числом шагов (Loop) цикл по условию (Until). Различие между тремя видами каскадов очевидно – простой каскад функционирует один раз, цикл Loop функционирует указанное в описании число раз, а цикл Until функционирует до тех пор, пока не выполнится указанное в описании условие. В условии, указываемом в заголовке цикла Until, возможно использование сравнений массивов или интервалов массивов сигналов. Например, запись

InSignals=OutSignals

эквивалентна следующей записи

InSignals[1..N]=OutSignals[1..N]

которая эквивалентна вычислению следующей логической функции:

Function Equal(InSignals, OutSignals : RealArray) : Logic;

       Var Long I;

             Logic L

       Begin

             L = True

             For I = 1 To N Do

                   L = L And (InSignals[I] = OutSignals[I]);

             Equal = L

       End

Раздел описания состава следует сразу после заголовка блока за разделом описания сигналов и параметров и начинается с ключевого слова Contents, за которым следуют имена подсетей (блоков или элементов) со списками фактических аргументов, разделенные запятыми. Все имена подсетей должны предваряться псевдонимами. В дальнейшем указание псевдонима полностью эквивалентно указанию имени подсети со списком фактических аргументов или без, в зависимости от контекста. Признаком конца раздела описания состава подсети служит имя подсети за списком фактических аргументов которого не следует запятая.

Раздел описания сигналов и параметров следует за разделом описания состава и состоит из указания числа входных и выходных сигналов и числа параметров блока. В константных выражениях, указывающих число входных и выходных сигналов и параметров можно использовать дополнительно функцию NumberOf с двумя параметрами. Первым параметром является одно из ключевых слов InSignals, OutSignals, Parameters, а вторым – имя подсети со списком фактических аргументов. Функция NumberOf возвращает число входных или выходных сигналов или параметров (в зависимости от первого аргумента) в подсети, указанной во втором аргументе. Использование этой функции необходимо в случае использования блоком аргументов-подсетей. Концом раздела описания сигналов и параметров служит одно из ключевых слов ParamDef, Static или Connections.

Раздел определения типов параметров является необязательным разделом в описании блока и начинается с ключевого слова ParamDef. В каждой строке этого раздела можно задать минимальную и максимальную границы изменения одного типа параметров. Если в описании сети встречаются параметры неопределенного типа, то этот тип считается совпадающим с типом DefaultType. Описание типа не обязано предшествовать описанию параметров этого типа. Так, например, определение типа параметров может находиться в описании главной сети. Концом этого раздела служит одно из ключевых слов Connections.

Раздел описания связей следует за разделом описания сигналов и параметров и начинается с ключевого слова Connections. В разделе «Описание распределения сигналов» детально описано распределение связей.

Раздел конца описания блока состоит из ключевого слова End, за которым следует имя блока.

Пример описания блоков

При описании блоков используются элементы, описанные в библиотеке Elements, приведенной в разделе «Пример описания элементов».

NetBibl SubNets Used Elements;

{Библиотека подсетей, использующая библиотеку Elements}

{Сигмоидный нейрон с произвольным сумматором на N входов}

Cascad NSigm(aSum : Block; N : Long; Char : Real)

{В состав каскада входит произвольный сумматор на N входов и сигмоидный нейрон с необучаемой характеристикой}

      Contents aSum(N), S_NotTrain(Char)

      InSignals NumberOf(InSignals, aSum(N))                   {Число входных сигналов определяет сумматор}

      OutSignals 1                                                                       {Один выходной сигнал}

      Parameters NumberOf(Parameters, aSum(N))            {Число параметров определяет сумматор}

      Connections

                         {Входные сигналы каскада – входные сигналы сумматора}

             InSignals[1.. NumberOf(InSignals, aSum(N))] <=> aSum.InSignals[1.. NumberOf(InSignals, aSum(N))]

                         {Выход сумматроа – вход нелинейного преобразователя}

             aSum.OutSignals <=> S_NotTrain.InSignals

                         {Выход преобразователя – выход каскада}

             OutSignals <=> S_NotTrain.OutSignals

             Parameters[1.. NumberOf(Parameters, aSum(N))] <=>

                   aSum.Parameters[1.. NumberOf(Parameters, aSum(N))]

End                   {Конец описания сигмоидного нейрона с произвольным сумматором}

                         {Слой сигмоидных нейронов с произвольными сумматорами на N входов}

Layer Lay1(aSum : Block; N,M : Long; Char : Real)

      Contents Sigm: NSigm(aSum,N,Char)[M]    {В состав слоя входит M нейронов}

      InSignals M * NumberOf(InSignals, Sigm)

{Число входных сигналов определяется как взятое M раз число входных сигналов нейронов. Вместо имени нейрона используем псевдоним}

      OutSignals M                                                                     {Один выходной сигнал на нейрон}

      Parameters M * NumberOf(Parameters, Sigm)

{Число параметров определяется как взятое M раз число параметров нейронов}

      Connections

{Ïåðâûå NumberOf(InSignals, NSigm(aSum,N,Char)) сигналов первому нейрону, и т.д.}

             InSignals[1..M * NumberOf(InSignals, Sigm)] <=> Sigm[1..M].InSignals[1.. NumberOf(InSignals, Sigm)]

                         {Выходные сигналы нейронов - выходные сигналы сети}

             OutSignals[1..M] <=> Sigm[1..M].OutSignals

                         {Параметры слоя – параметры нейронов}

             Parameters[1..M * NumberOf(Parameters, Sigm)] <=>

                   Sigm[1..M].Parameters[1.. NumberOf(Parameters, Sigm)]

End                   {Конец описания слоя сигмоидных нейронов с произвольным сумматором}

                         {Слой точек ветвления}

Layer BLay( N,M : Long)

      Contents Branch(N)[M]        {В состав слоя входит M точек ветвления}

      InSignals M                                  {По одному входному сигналу на точку ветвления}

      OutSignals M * N                        {N выходных сигналов у каждой точки ветвления}

      Connections

             InSignals[1..M] <=> Branch[1..M].InSignals   {По одному входу на точку ветвления}

{Выходные сигналы в порядке первый с каждой точки ветвления, затем второй и т.д. }

             OutSignals[1..N * M] <=> Branch[+:1..M].OutSignals[1..N]

End                                                         {Конец описания слоя Точек ветвления}

{Полный слой сигмоидных нейронов с произвольными сумматорами на N входов}

Cascad FullLay(aSum : Block; N,M : Long; Char : Real)

      Contents Br: BLay1(M,N), Ne: Lay1(aSum,N,M,Char) {Слой точек ветвления и слой нейронов}

      InSignals N                                   {Число входных сигналов – число точек ветвления}

      OutSignals M                               {Один выходной сигнал на нейрон}

      Parameters NumberOf(Parameters, Ne)

{Число параметров определяется как взятое M раз число параметров нейронов}

      Connections

{Входные сигналы – слою точек ветвления}

             InSignals[1..N]<=> Br.InSignals[1..N]

{Выходные сигналы нейронов - выходные сигналы сети}

             OutSignals[1..M] <=> Ne.OutSignals[1..M]

{Параметры слоя – параметры нейронов}

             Parameters[1..NumberOf(Parameters, Ne)] <=> Ne.Parameters[1.. NumberOf(Parameters, Ne)]

{Выход слоя точек ветвления – вход слоя нейронов}

             Br.OutSignals[1..N * M] <=> Ne.InSignals[1..N * M]

End      {Конец описания слоя сигмоидных нейронов с произвольным сумматором}

{Сеть с сигмоидными нейронами и произвольными сумматорами, содержащая

                   Input – число нейронов на входном слое;

                   Output – число нейронов на выходном слое (число выходных сигналов);

                   Hidden – число нейронов на H>0 скрытых слоях;

                   N – число входных сигналов

все входные сигналы подаются на все нейроны входного слоя}

Cascad  Net1(aSum : Block; Char : Real; Input, Output, Hidden, H, N : Long)

{Под тремя разными псевдонимами используется одна и та же подсеть с разными параметрами}

      Contents

             In: FullLay(aSum,N,Input,Char),

             Hid1: FullLay(aSum,Input,Hidden,Char)

             Hid2: FullLay(aSum,Hidden,Hidden,Char)[H-1]                         {Пусто при H=1}

             Out: FullLay(aSum,Hidden,Output,Char)

      InSignals N                                                             {Число входных сигналов – N}

      OutSignals Output                                                {Один выходной сигнал на нейрон}

{Число параметров определяется как сумма чисел параметров всех подсетей}

      Parameters NumberOf(Parameters, In)+ NumberOf(Parameters, Hid1)+

             (H-1) * NumberOf(Parameters, Hid2)+ NumberOf(Parameters, Out)

      Connections

{Входные сигналы – входному слою}

             InSignals[1..N]<=> In.InSignals[1..N]

{Выходные сигналы нейронов - с выходного слоя сети}

             OutSignals[1..Output] <=> Out.OutSignals[1.. Output]

{Ïàðàìåòðû ñeòè ïîñëåäîâàòåëüíî âñåì ïîäñåòÿì}

             Parameters[1..NumberOf(Parameters,In)] <=> In.Parameters[1.. NumberOf(Parameters, In)]

             Parameters[NumberOf(Parameters,In)+1..NumberOf(Parameters,In)+

                   NumberOf(Parameters, Hid1)] <=> Hid1.Parameters[1.. NumberOf(Parameters, Hid1)]

             Parameters[NumberOf(Parameters,In)+ NumberOf(Parameters, Hid1)]+1

                   ..NumberOf(Parameters,In)+NumberOf(Parameters, Hid1)+

                   (H-1) * NumberOf(Parameters, Hid2)] <=> Hid2[1..H-1].Parameters[1.. NumberOf(Parameters, Hid2)]

             Parameters[NumberOf(Parameters,In)+ NumberOf(Parameters, Hid1)]+

                         (H-1) * NumberOf(Parameters, Hid2)+1..NumberOf(Parameters,In)+

                         NumberOf(Parameters,Hid1)+(H-1)*NumberOf(Parameters,Hid2)+

                         NumberOf(Parameters, Out)] <=> Out.Parameters[1.. NumberOf(Parameters, Out)]

{Передача сигналов от слоя к слою}

{От входного к первому скрытому слою}

             In.OutSignals[1..Input] <=> Hid1.InSignals[1..Input]

{От первого скрытого слоя}

             Hid1.OutSignals[1..Hidden] <=> Hid2[1].InSignals[1..Hidden]

{Между скрытыми слоями. При H=1 эта запись пуста}

             Hid2[1..H-2].OutSignals[1.. Hidden] <=> Hid2[2..H-1].InSignals[1.. Hidden]

{От скрытых – к выходному}

             Hid2[H-1].OutSignals[1.. Hidden] <=> Out.InSignals[1.. Hidden]    

End

{Полносвязная сеть с M сигмоидными нейронами на К тактов функционирования с невыделенным входным слоем на M сигналов}

Loop Circle(aSum : Block; Char : Real; M, K : Long) K

      Contents

             Net: FullLay(aSum,M,M,Char)

      InSignals M                                                            {Число входных сигналов – N}

      OutSignals M                                                        {Один выходной сигнал на нейрон}

      Parameters NumberOf(Parameters, Net) {Число параметров определяется слоем FullLay}

      Connections

             InSignals[1..M]<=> Net.InSignals[1..M]    {Входные сигналы цикла – входы слоя}

             OutSignals[1..M] <=> Net.OutSignals[1.. M] {Выходы слоя – выходы цикла}

                                            {Параметры определяет слой}

             Parameters[1..NumberOf(Parameters,Net)] <=>

                                      Net.Parameters[1.. NumberOf(Parameters,Net)]

             Net.OutSignals[1..M] <=> Net.InSignals[1..M]           {Замыкаем выход на вход}

End      {Конец описания слоя сигмоидных нейронов с произвольным сумматором}

{Полносвязная сеть с М сигмоидными нейронами на К тактов функционирования с выделенным входным слоем на N сигналов. Все входные сигналы подаются на вход каждого нейрона входного слоя. Все параметры ограничены по абсолютному значению единицей}

Cascad  Net2: (aSum : Block; Char : Real; M, K, N : Long)

      Contents

             In: FullLay(aSum,N,M,Char),                                      {Входной слой}

             Net: Circle(aSum,Char,M,K)                                 {Полносвязная сеть}

      InSignals N                                                                         {Число входных сигналов – N}

      OutSignals M                                                                     {Один выходной сигнал на нейрон}

{Число параметров определяется как сумма чисел параметров всех подсетей}

      Parameters NumberOf(Parameters, In)+ NumberOf(Parameters, Net)

      ParamDef DefaultType -1 1

      Connections

             InSignals[1..N]<=> In.InSignals[1..N]  {Входные сигналы – входному слою}

{Выходные сигналы нейронов - с выходного слоя сети}

             OutSignals[1..M] <=> Net.OutSignals[1.. M]

{Параметры сети последовательно всем подсетям}

             Parameters[1..NumberOf(Parameters, In)] <=> In.Parameters[1.. NumberOf(Parameters, In)]

             Parameters[NumberOf(Parameters,In)+1..NumberOf(Parameters,In)+NumberOf(Parameters, Net)]

                   <=> Net.Parameters[1.. NumberOf(Parameters, Net)]

{Передача сигналов от слоя к слою}

             In.OutSignals[1..M] <=> Net.InSignals[1..M]              {От входного к циклу}

             Net.OutSignals[1..M] <=> Net.InSignals[1..M]                  {От первого скрытого слоя}

End

{Нейрон сети Хопфилда из N нейронов}

Cascad Hopf(N : Long)

      Contents Sum(N),Sign_Easy                                      {Сумматор и пороговый элемент}

      InSignals N                                                                   {Число входных сигналов – N}

      OutSignals 1                                                                 {Число выходных сигналов – 1}

      Parameters NumberOf(Parameters,Sum(N)) {Число параметров – N}

      Connections

             InSignals[1..N]<=> Sum.InSignals[1..N]     {Входы нейрона – входы сумматора}

{Выходной сигнал нейрона – выходной сигнал порогового элемета}

             OutSignals <=> Sign_Easy.OutSignals

{Параметры нейрона – парамеры сумматора}

             Parameters[1..NumberOf(Parameters, Sum(N))] <=>

                   Sum.Parameters[1.. NumberOf(Parameters, Sum(N))]

{Выход сумматора на вход порогового элемента}

             Sum.OutSignals <=> Sign_Easy.InSignals

End

{Слой нейронов Хопфилда}

Layer HLay(N : Long)

      Contents Hop: Hopf(N)[N]                             {В состав слоя входит N нейронов}

      InSignals N * N                                               {N нейронов по N входных сигналов}

      OutSignals N                                                   {Один выходной сигнал на нейрон}

      Parameters N * NumberOf(Parameters, Hop)

      Connections

{NumberOf(InSignals, Hop) сигналов первому нейрону, и т.д.}

             InSignals[1..Sqr(N)] <=> Hop[1..N].InSignals[1..N]

{Выходные сигналы нейронов - выходные сигналы сети}

             OutSignals[1..N] <=> Hop[1..N].OutSignals

{Параметы слоя – параметры нейронов}

             Parameters[1..N * NumberOf(Parameters, Hop)] <=>

                   Hop[1..N].Parameters[1.. NumberOf(Parameters, Hop)]

End

{Сеть Хопфилда из N нейронов}

Until Hopfield(N : Long) InSignals=OutSignals

      Contents BLay(N,N),HLay(N)                 {Слой точек ветвления и слой нейронов}

      InSignals N                                                {Число входных сигналов – N}

      OutSignals N                                             {Число выходных сигналов – N}

      Parameters N * NumberOf(Parameters,HLay(N))      {Число параметров – N*N}

      Connections

{Входные сигналы – точкам ветвления}

             InSignals[1..N]<=> BLay.InSignals[1..N]

{Выходные сигналы нейронов – выходные сигналы сети}

             OutSignals[1..N] <=> HLay.OutSignals[1..N]

            Parameters[1..N*NumberOf(Parameters, HLay(N))] <=>

                   HLay.Parameters[1..N*NumberOf(Parameters, HLay(N))]

                         {Выход точек ветвления на вход нейронов}

             BLay.OutSignals[1..Sqr(N)] <=> HLay.InSignals[1..Sqr(N)]

{Замыкаем конец на начало}

             HLay.OutSignals[1..N] <=> BLay.InSignals[1..N]

End

End NetLib

NetWork Hop Used SubNets;                {Сеть Хопфилда на пять нейронов}

MainNet Hopfield(5)

Parameters 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;

ParamMask -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1;

End NetWork

Сокращение описания сети

Предложенный в предыдущих разделах язык описания многословен. В большинстве случаев за счет хорошей структуризации сети можно опустить все разделы описания блока кроме раздела состава. В данном разделе описывается генерация по умолчанию разделов описания сигналов и параметров, и описания связей. Использование механизмов умолчания позволяет сильно сократить текст описания сети.

Раздел описания сигналов и параметров

Для всех видов блоков число параметров определяется как сумма чисел параметров всех подсетей, перечисленных в разделе описания состава. Это может приводить к лишним записям, но не повлияет на работу сети. Примером лишней записи может служить генерируемая запись:

Parameters M * NumberOf(Parameters,Branch(N))

в описании слоя точек ветвления, поскольку точки ветвления не имеют параметров.

Число входных сигналов блока определяется по следующим правилам:

  • для слоя число входных сигналов равно сумме числа входных сигналов всех подсетей, перечисленных в разделе описания состава;
  • для каскадов всех видов число входных сигналов блока равно числу входных сигналов подсети, стоящей первой в списке подсетей в разделе описания состава

Число выходных сигналов блока определяется по следующим правилам:

  • для слоя число выходных сигналов равно сумме числа выходных сигналов всех подсетей, перечисленных в разделе описания состава;
  • для каскадов всех видов число выходных сигналов блока равно числу выходных сигналов подсети, стоящей последней в списке подсетей в разделе описания состава;

Описания всех сетей, приведенные в предыдущем разделе полностью соответствуют правилам генерации. В качестве более общего примера приведем раздел описания сигналов и параметров двух условных блоков.

Layer  A

   Contents Net1, Net2[K], Net3

   InSignals NumberOf(InSignals,Net1)+K*NumberOf(InSignals,Net2)

          +NumberOf(InSignals,Net3)

   OutSignals NumberOf(OutSignals,Net1)+K*NumberOf(OutSignals,Net2)

          +NumberOf(OutSignals,Net3)

   Parameters NumberOf(Parameters,Net1)+

          K*NumberOf(Parameters,Net2)+NumberOf(Parameters,Net3)

Cascad  B

   Contents Net1, Net2[K], Net3

   InSignals NumberOf(InSignals,Net1)

   OutSignals NumberOf(OutSignals,Net3)

   Parameters NumberOf(Parameters,Net1)+

          K*NumberOf(Parameters,Net2)+NumberOf(Parameters,Net3)

Раздел описания связей

Раздел описания связей может быть разбит на пять подразделов.

  1. Установление связи входных сигналов блока с входными сигналами подсетей.
  1. Установление связи выходных сигналов блока с выходными сигналами подсетей.
  1. Установление связи параметров блока с параметрами подсетей.
  1. Установление связи между выходными сигналами одних подсетей и входными сигналами других подсетей.
  1. Замыкание выхода блока на вход блока.

Для слоя раздел описания связей строится по следующим правилам.

  1. Все подсети получают входные сигналы в порядке перечисления подсетей в разделе описания состава – первая часть массива входных сигналов слоя отдается первой подсети, следующая – второй и т.д. Если какая-либо подсеть в разделе описания состава указана с некоторым не равным единице числом экземпляров, то считается, что экземпляры этой подсети перечислены в списке в порядке возрастания номера.
  1. Выходные сигналы подсетей образуют массив выходных сигналов слоя также в порядке перечисления подсетей в разделе описания состава – первая часть массива выходных сигналов слоя состоит из выходных сигналов первой подсети, следующая – второй и т.д. Если какая-либо подсеть в разделе описания состава указана с некоторым не равным единице числом экземпляров, то считается, что экземпляры этой подсети перечислены в списке в порядке возрастания номера.
  1. Подразделы установления связи между выходными сигналами одних подсетей и входными сигналами других подсетей и замыкания выхода блока на вход для слоя отсутствуют.

Для каскадов раздел описания связей строится по следующим правилам:

  1. Входные сигналы блока связываются с входными сигналами первой подсети в списке подсетей в разделе описания состава. Если для первой подсети указано не единичное число экземпляров, то все входные сигналы связываются с входными сигналами первого экземпляра подсети.
  1. Выходные сигналы блока связываются с выходными сигналами последней подсети в списке подсетей в разделе описания состава. Если для последней подсети указано не единичное число экземпляров, то все выходные сигналы связываются с выходными сигналами последнего (с максимальным номером) экземпляра подсети.
  1. Массив параметров блока образуется из массивов параметров подсетей в порядке перечисления подсетей в разделе описания состава – первая часть массива параметров блока состоит из параметров первой подсети, следующая – второй и т.д. Если какая-либо подсеть в разделе описания состава указана с некоторым не равным единице числом экземпляров, то считается, что экземпляры этой подсети перечислены в списке в порядке возрастания номера.
  1. Выходные сигналы каждой подсети, кроме последней связываются с входными сигналами следующей подсети в списке подсетей в разделе описания состава. Если какая-либо подсеть в разделе описания состава указана с некоторым не равным единице числом экземпляров, то считается, что экземпляры этой подсети перечислены в списке в порядке возрастания номера.
  1. Для блоков типа Cascad замыкание выхода блока на вход блока отсутствует. Для блоков типов Loop и Until замыкание выхода блока на вход блока достигается путем установления связей между выходными сигналами последней подсети в списке подсетей в разделе описания состава с входными сигналами первой подсети в списке подсетей в разделе описания состава. Если какая-либо подсеть в разделе описания состава указана с некоторым не равным единице числом экземпляров, то считается, что экземпляры этой подсети перечислены в списке в порядке возрастания номера.

Описания всех сетей, приведенные в предыдущем разделе полностью соответствуют правилам генерации. В качестве более общего примера приведем раздел описания сигналов и параметров трех условных блоков.

Layer  A

   Contents Net1, Net2[K], Net3

   InSignals[1..NumberOf(InSignals,Net1)+K*NumberOf(InSignals,Net2)+NumberOf(InSignals,Net3)]

          <=>Net1. InSignals[1..NumberOf(InSignals,Net1)],

          Net2[1..K].InSignals[1..NumberOf(InSignals,Net2)],Net3.InSignals[1..NumberOf(InSignals,Net3)]

   OutSignals[1..NumberOf(OutSignals,Net1)+

          K*NumberOf(OutSignals,Net2)+NumberOf(OutSignals,Net3)] <=>

          Net1. OutSignals[1..NumberOf(OutSignals,Net1)],

          Net2[1..K].OutSignals[1..NumberOf(OutSignals,Net2)],

          Net3.OutSignals[1..NumberOf(OutSignals,Net3)]

   Parameters[1..NumberOf(Parameters,Net1)+

          K*NumberOf(Parameters,Net2)+NumberOf(Parameters,Net3)] <=>

          Net1. Parameters[1..NumberOf(Parameters,Net1)],

          Net2[1..K].Parameters[1..NumberOf(Parameters,Net2)],

          Net3.Parameters[1..NumberOf(Parameters,Net3)]

Cascad B

   Contents Net1, Net2[K], Net3

   InSignals[1..NumberOf(InSignals,Net1)] <=> Net1. InSignals[1..NumberOf(InSignals,Net1)]

   OutSignals[1..NumberOf(OutSignals,Net3)] <=> Net3.OutSignals[1..NumberOf(OutSignals,Net3)]

   Parameters[1..NumberOf(Parameters,Net1)+

          K*NumberOf(Parameters,Net2)+NumberOf(Parameters,Net3)] <=>

          Net1. Parameters[1..NumberOf(Parameters,Net1)],

          Net2[1..K].Parameters[1..NumberOf(Parameters,Net2)],

          Net[3].Parameters[1..NumberOf(Parameters,Net3)]

   Net1. OutSignals[1..NumberOf(OutSignals,Net1)],

          Net2[1..K].OutSignals[1..NumberOf(OutSignals,Net2)] <=>

          Net2[1..K].InSignals[1..NumberOf(InSignals,Net2)],Net3.InSignals[1..NumberOf(InSignals,Net3)]

Loop  C N

   Contents Net1, Net2[K], Net3

   InSignals[1..NumberOf(InSignals,Net1)] <=> Net1. InSignals[1..NumberOf(InSignals,Net1)]

   OutSignals[1..NumberOf(OutSignals,Net3)] <=> Net3.OutSignals[1..NumberOf(OutSignals,Net3)]

   Parameters[1..NumberOf(Parameters,Net1)+

          K*NumberOf(Parameters,Net2)+NumberOf(Parameters,Net3)] <=>

          Net1. Parameters[1..NumberOf(Parameters,Net1)],

          Net2[1..K].Parameters[1..NumberOf(Parameters,Net2)],

          Net[3].Parameters[1..NumberOf(Parameters,Net3)]

   Net1. OutSignals[1..NumberOf(OutSignals,Net1)],

          Net2[1..K].OutSignals[1..NumberOf(OutSignals,Net2)] <=>

          Net2[1..K].InSignals[1..NumberOf(InSignals,Net2)],

          Net3.InSignals[1..NumberOf(InSignals,Net3)]

   Net3.OutSignals[1..NumberOf(OutSignals,Net3)] <=> Net1. InSignals[1..NumberOf(InSignals,Net1)]

Частично сокращенное описание

Если описываемый блок должен иметь связи, устанавливаемые не так, как описано в разделе «Раздел описания связей», то соответствующий раздел описания блока может быть описан явно полностью или частично. Если какой либо раздел описан частично, то действует следующее правило: те сигналы, параметры и их связи, которые описаны явно, берутся из явного описания, а те сигналы, параметры и их связи, которые не фигурируют в явном описании берутся из описания по умолчанию. Так, в приведенном в разделе «Пример описания блоков» описании слоя точек ветвления BLay невозможно использование генерируемого по умолчанию подраздела установления связи выходных сигналов блока с входными сигналами подсетей. Возможно следующее сокращенное описание.

                         {Слой точек ветвления}

Layer BLay( N,M : Long)

      Contents Branch(N)[M]        {В состав слоя входит M точек ветвления}

      Connections

{Выходные сигналы в порядке первый с каждой точки ветвления, затем второй и т.д. }

             OutSignals[1..N * M] <=> Branch[+:1..M].OutSignals[1..N]

End                                                         {Конец описания слоя Точек ветвления}

Пример сокращенного описания блоков

При описании блоков используются элементы, описанные в библиотеке Elements, приведенной в разд. «Пример описания элементов».

NetBibl SubNets Used Elements;           {Библиотека подсетей, использующая библиотеку Elements}

                         {Сигмоидный нейрон с произвольным сумматором на N входов}

Cascad NSigm(aSum : Block; N : Long; Char : Real)

{В состав каскада входит произвольный сумматор на N входов и сигмоидный нейрон с необучаемой характеристикой}

      Contents aSum(N), S_NotTrain(Char)

End

{Слой сигмоидных нейронов с произвольными сумматорами на N входов}

Layer Lay1(aSum : Block; N,M : Long; Char : Real)

      Contents Sigm: NSigm(aSum,N,Char)[M]    {В состав слоя входит M нейронов}

End

{Слой точек ветвления}

Layer BLay( N,M : Long)

      Contents Branch(N)[M]                           {В состав слоя входит M точек ветвления}

      Connections

{Выходные сигналы в порядке первый с каждой точки ветвления, затем второй и т.д. }

             OutSignals[1..N * M] <=> Branch[+:1..M].OutSignals[1..N]

End

{Полный слой сигмоидных нейронов с произвольными сумматорами на N входов}

Cascad FullLay(aSum : Block; N,M : Long; Char : Real)

      Contents BLay1(M,N), Lay1(aSum,N,M,Char)  {Слой точек ветвления и слой нейронов}

End      {Конец описания слоя сигмоидных нейронов с произвольным сумматором}

{Сеть с сигмоидными нейронами и произвольными сумматорами, содержащая

             Input – число нейронов на входном слое;

             Output – число нейронов на выходном слое (число выходных сигналов);

             Hidden – число нейронов на H>0 скрытых слоях;

             N – число входных сигналов

все входные сигналы подаются на все нейроны входного слоя}

Cascad  Net1(aSum : Block; Char : Real; Input, Output, Hidden, H, N : Long)

{Под тремя разными псевдонимами используется одна и таже подсеть с разными параметрами. Использование псевдонимов необходимо даже при сокращенном описании}

      Contents

             In: FullLay(aSum,N,Input,Char),

             Hid1: FullLay(aSum,Input,Hidden,Char)

             Hid2: FullLay(aSum,Hidden,Hidden,Char)[H-1]                         {Пусто при H=1}

             Out: FullLay(aSum,Hidden,Output,Char)

End

{Полносвязная сеть с M сигмоидными нейронами на К тактов функционирования с невыделенным входным слоем на M сигналов. Все параметры ограничены по абсолютному значению единицей}

Loop Circle(aSum : Block; Char : Real; M, K : Long) K

      Contents

             FullLay(aSum,M,M,Char)

      ParamDef DefaultType -1 1

End

{Полносвязная сеть с М сигмоидными нейронами на К тактов функционирования с выделенным входным слоем на N сигналов.

Cascad Net2: (aSum : Block; Char : Real; M, K, N : Long)

      Contents

             In: FullLay(aSum,N,M,Char),                                      {Входной слой}

             Net: Circle(aSum,Char,M,K)                                        {Полносвязная сеть}

End

Cascad Hopf(N : Long)                                         {Нейрон сети Хопфилда из N нейронов}

      Contents Sum(N),Sign_Easy                                            {Сумматор и пороговый элемент}

End

{Слой нейронов Хопфилда}

Layer HLay(N : Long)

      Contents Hop: Hopf(N)[N]                                   {В состав слоя входит N нейронов}

End

{Сеть Хопфилда из N нейронов}

Until Hopfield(N : Long)  InSignals=OutSignals

      Contents BLay(N,N),HLay(N)                 {Слой точек ветвления и слой нейронов}

End

End NetLib

Стандарт второго уровня компонента сеть

В данном разделе рассмотрены все запросы, исполняемые компонентом сеть. Прежде чем приступать к описанию стандарта запросов компонента сеть следует выделить выполняемые им функции. Что должен делать компонент сеть? Очевидно, что прежде всего он должен уметь выполнять такие функции, как функционирование вперед (работа обученной сети) и назад (вычисление вектора поправок или градиента для обучения), модернизацию параметров (обучение сети) и входных сигналов (обучение примера). Кроме того компонент сеть должен уметь читать сеть с диска и записывать ее на диск. Необходимо так же предусмотреть возможность создавать сеть и редактировать ее структуру. Эти две функциональные возможности не связаны напрямую с работой (функционированием и обучением) сети. Таким образом, необходимо выделить сервисную компоненту – редактор сетей. Компонент редактор сетей позволяет создавать и изменять структуру сети, модернизировать обучаемые параметры в «ручном» режиме.

Запросы к компоненту сеть

Запросы к компоненту сеть можно разбить на пять групп:

  1. Функционирование.
  1. Изменение параметров.
  1. Работа со структурой.
  1. Инициация редактора и конструктора сетей.
  1. Обработка ошибок.

Поскольку компонент сеть может работать одновременно с несколькими сетями, большинство запросов к сети содержат явное указание имени сети. Отметим, что при генерации запросов в качестве имени сети можно указывать имя любой подсети. Таким образом, иерархическая структура сети, описанная в стандарте языка описания сетей, позволяет работать с каждым блоком или элементом сети как с отдельной сетью. Ниже приведено описание всех запросов к компоненту сеть. Каждый запрос является логической функцией, возвращающей значение истина, если запрос выполнен успешно, и ложь – при ошибочном завершении исполнения запроса.

Таблица 26.

Значения предопределенных констант

Название Величина Значение
InSignals 0 Входные сигналы прямого функционирования
OutSignals 1 Выходные сигналы прямого функционирования
Рarameters 2 Параметры
InSignalMask 3 Маска обучаемости входных сигналов
ParamMask 4 Маска обучаемости параметров
BackInSignals 5 Входные сигналы обратного функционирования
BackOutSignals 6 Выходные сигналы обратного функционирования
BackРarameters 7 Поправки к параметрам
Element 0 Тип подсети – элемент
Layer 1 Тип подсети – слой
Cascad 2 Тип подсети – простой каскад
CicleFor 3 Тип подсети – цикл с заданным числом проходов
CicleUntil 4 Тип подсети – цикл по условию

При вызове ряда запросов используются предопределенные константы. Их значения приведены в табл. 26.

Запросы на функционирование

Два запроса первой группы позволяют проводить прямое и обратное функционирование сети. По сути эти запросы эквивалентны вызову методов Forw и Back сети или ее элемента.

Выполнить прямое Функционирование (Forw)

Описание запроса:

Pascal:

Function Forw ( Net : PString; InSignals : PRealArray ) : Logic;

C:

Logic Forw(PString Net, PRealArray InSignals)

Описание аргумента:

Net – указатель на строку символов, содержащую имя сети.

InSignals – массив входных сигналов сети.

Назначение – проводит прямое функционирование сети, указанной в параметре Net.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая сеть в списке сетей компонента сеть.
  1. Если список сетей компонента сеть пуст или имя сети, переданное в аргументе Net в этом списке не найдено, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Вызывается метод Forw сети, имя которой было указано в аргументе Net.
  1. Если во время выполнения запроса возникает ошибка, то генерируется внутренняя ошибка 304 - ошибка прямого функционирования. Управление передается обработчику ошибок. Выполнение запроса прекращается. В противном случае выполнение запроса успешно завершается.

Выполнить обратное Функционирование (Back)

Описание запроса:

Pascal:

Function Back( Net : PString; BackOutSignals : PRealArray) : Logic;

C:

Logic Back(PString Net, PRealArray BackOutSignals)

Описание аргумента:

Net – указатель на строку символов, содержащую имя сети.

BackOutSignals – массив производных функции оценки по выходным сигналам сети.

Назначение – проводит обратное  функционирование сети, указанной в параметре Net.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая сеть в списке сетей компонента сеть.
  1. Если список сетей компонента сеть пуст или имя сети, переданное в аргументе Net в этом списке не найдено, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Вызывается метод Back сети, имя которой было указано в аргументе Net.
  1. Если во время выполнения запроса возникает ошибка, то генерируется внутренняя ошибка 305 -  ошибка обратного функционирования. Управление передается обработчику ошибок. Выполнение запроса прекращается. В противном случае выполнение запроса успешно завершается.

Запросы на изменение параметров

Ко второй группе запросов относятся четыре запроса: Modify – модификация параметров, обычно называемая обучением, ModifyMask – модификация маски обучаемых синапсов, NullGradient – обнуление градиента и RandomDirection – сгенерировать случайное направление спуска.

Провести обучение (Modify)

Описание запроса:

Pascal:

Function Modify( Net : PString; OldStep, NewStep : Real; Tipe : Integer; Grad : PRealArray ) : Logic;

C:

Logic Modify(PString Net, Real OldStep, Real NewStep, Integer Tipe, PRealArray Grad)

Описание аргументов:

Net – указатель на строку символов, содержащую имя сети.

OldStep, NewStep – параметры обучения.

Tipe – одна из констант InSignals или Parameters.

Grad – адрес массива поправок или пустой указатель.

Назначение – проводит обучение параметров или входных сигналов сети, указанной в параметре Net.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая сеть в списке сетей компонента сеть.
  1. Если список сетей компонента сеть пуст или имя сети, переданное в аргументе Net в этом списке не найдено, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если аргумент Grad содержит пустой указатель, то поправки берутся из массива Back.Parameters или Back.InputSignals в зависимости от значения аргумента Tipe.
  1. В зависимости от значения аргумента Tipe для каждого параметра или входного сигнала P, при условии, что соответствующий ему элемент маски обучаемости, соответствующей аргументу Tipe равен -1 (значение истина) выполняется следующая процедура:
    • P1=P*OldStep+DP*NewStep
    • Если для типа, которым описан параметр P, заданы минимальное и максимальное значения, то:
    • P2=Pmin, при P1
    • P2=Pmax, при P1>Pmax
    • P2=P1 в противном случае

Изменить маску обучаемости (ModifyMask)

Описание запроса:

Pascal:

Function ModifyMask( Net : PString; Tipe : Integer; NewMask: PLogicArray ) : Logic;

C:

Logic Modify(PString Net, Integer Tipe, PLogicArray NewMask)

Описание аргументов:

Net – указатель на строку символов, содержащую имя сети.

Tipe – одна из констант InSignals или Parameters.

NewMask – новая маска обучаемости.

Назначение – Заменяет маску обучаемости параметров или входных сигналов сети, указанной в параметре Net.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая сеть в списке сетей компонента сеть.
  1. Если список сетей компонента сеть пуст или имя сети, переданное в аргументе Net в этом списке не найдено, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В зависимости от значения параметра Tipe заменяет маску обучаемости параметров или входных сигналов на переданную в параметре NewMask.

Обнулить градиент (NullGradient)

Описание запроса:

Pascal:

Function NullGradient( Net : PString ) : Logic;

C:

Logic NullGradient(PString Net)

Описание аргументов:

Net – указатель на строку символов, содержащую имя сети.

Назначение – производит обнуление градиента сети, указанной в параметре Net.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая сеть в списке сетей компонента сеть.
  1. Если список сетей компонента сеть пуст или имя сети, переданное в аргументе Net в этом списке не найдено, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Обнуляются массивы Back.Parameters и Back.OutSignals.

Случайное направление спуска (RandomDirection)

Описание запроса:

Pascal:

Function RandomDirection( Net : PString; Range : Real ) : Logic;

C:

Logic RandomDirection(PString Net, Real Range)

Описание аргументов:

Net – указатель на строку символов, содержащую имя сети.

Range – относительная ширина интервала, на котором должны быть распределены значения случайной величины.

Назначение – генерирует вектор случайных поправок к параметрам сети.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая сеть в списке сетей компонента сеть.
  1. Если список сетей компонента сеть пуст или имя сети, переданное в аргументе Net в этом списке не найдено, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Замещают все значения массива Back.Parameters на случайные величины. Интервал распределения случайной величины зависит от типа параметра, указанного при описании сети (ParamType) и аргумента Range. Полуширина интервала определяется как произведение полуширины интервала допустимых значений параметра, указанных в разделе ParamDef описания сети на величину Range. Интервал распределения случайной величины определяется как [-Полуширина; Полуширина].

Запросы, работающие со структурой сети

К третьей группе относятся запросы, позволяющие изменять структуру сети. Часть запросов этой группы описана в разд. «Остальные запросы».

Вернуть параметры сети (nwGetData)

Описание запроса:

Pascal:

Function nwGetData(Net : PString; DataType : Integer; Var Data : PRealArray) : Logic;

C:

Logic nwGetData(PString Net, Integer DataType, PRealArray* Data)

Описание аргументов:

Net – указатель на строку символов, содержащую имя сети.

DataType – одна из восьми предопределенных констант, описывающих тип данных сети.

Data – возвращаемый массив параметров сети.

Назначение – возвращает параметры, входные или выходные сигналы сети, указанной в аргументе Net.

Описание исполнения.

  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является перавя сеть в списке сетей компонента сеть.
  1. Если имя сети, переданное в аргументе Net не найдено в списке сетей компонента сеть или этот список пуст, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если значение, переданное в аргументе DataType больше семи или меньше нуля, то возникает ошибка 306 – ошибочный тип параметра сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В массиве Data возвращаются указанные в аргументе DataType параметры сети.

Установить параметры сети (nwSetData)

Описание запроса:

Pascal:

Function nwSetData(Net : PString; DataType : Integer; Var Data : RealArray) : Logic;

C:

Logic nwSetData(PString Net, Integer DataType, RealArray* Data)

Описание аргументов:

Net – указатель на строку символов, содержащую имя сети.

DataType – одна из восьми предопределенных констант, описывающих тип данных сети.

Data – массив параметров для замещения текущего массива параметров сети.

Назначение – замещает параметры, входные или выходные сигналы сети, указанной в аргументе Net на значения из массива Data.

Описание исполнения.

  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая сеть в списке сетей компонента сеть.
  1. Если имя сети, переданное в аргументе Net не найдено в списке сетей компонента сеть или этот список пуст, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если значение, переданное в аргументе DataType больше семи или меньше нуля, то возникает ошибка 306 – ошибочный тип параметра сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Значения параметров (входных или выходных сигналов) сети заменяются на значения из массива Data. Если длинны массива Data недостаточно для замены значений всех параметров (входных или выходных сигналов), то замещаются только столько элементов массива параметров (входных или выходных сигналов) сколько элементов в массиве Data. Если длинна массива Data больше длинны массива параметров (входных или выходных сигналов), то заменяются все элементы вектора параметров (входных или выходных сигналов), а лишние элементы массива Data игнорируются.

Нормализовать сеть (NormalizeNet)

Описание запроса:

Pascal:

Function NormalizeNet(Net : PString) : Logic;

C:

Logic NormalizeNet(PString Net)

Описание аргумента:

Net – указатель на строку символов, содержащую имя сети.

Назначение – нормализация сети, указанной в аргументе Net.

Описание исполнения.

  1. Если в качестве аргумента Net дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая сеть в списке сетей компонента сеть.
  1. Если имя сети, переданное в аргументе Net не найдено в списке сетей компонента сеть или этот список пуст, то возникает ошибка 301 – неверное имя сети, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Из сети удаляются связи, имеющие нулевой вес и исключенные из обучения. Нумерация сигналов и параметров сохраняется.
  1. Из структуры сети удаляются «немые» участки – элементы и блоки, выходные сигналы которых не являются выходными сигналами сети в целом и не используются в качестве входных сигналов другими подсетями. Нумерация сигналов и параметров сохраняется.
  1. Производится замена элементов, ставших «прозрачными» – путем замыкания входного сигнала на выходной, удаляются простые однородные сумматоры с одним входом и точки ветвления с одним выходом; адаптивные однородные сумматоры с одним входом заменяются синапсами. Нумерация сигналов и параметров сохраняется.
  1. В каждом блоке производится замена имен подсетей на псевдонимы.
  1. Производится изменение нумерации сигналов и параметров сети.

Остальные запросы

Ниже приведен список запросов, исполнение которых описано в разделе «Общий стандарт»:

nwSetCurrent – Сделать сеть текущей

nwAdd – Добавление сети

nwDelete – Удаление сети

nwWrite – Запись сети

nwGetStructNames – Вернуть имена подсетей

nwGetType – Вернуть тип подсети

nwEdit – Редактировать компоненту сеть

OnError – Установить обработчик ошибок

GetError – Дать номер ошибки

FreeMemory – Освободить память

В запросе nwGetType  в переменной TypeId возвращается значение одной из предопределенных констант, перечисленных в табл. 26.

Следует заметить, что два запроса nwGetData (Получить параметры) и nwSetData (Установить параметры) имеют название, совпадающее с названием запросов, описанных в разделе «Общий стандарт», но они имеют другой набор аргументов.

Ошибки компонента сеть

В табл. 27 приведен полный список ошибок, которые могут возникать при выполнении запросов компонентом сеть, и действия стандартного обработчика ошибок.

Таблица 27

Ошибки компонента сеть и действия стандартного обработчика ошибок.

Название ошибки Стандартная обработка
301 Неверное имя сети Занесение номера в Error
302 Ошибка считывания сети Занесение номера в Error
303 Ошибка сохранения сети Занесение номера в Error
304 Ошибка прямого функционирования Занесение номера в Error
305 Ошибка обратного функционирования Занесение номера в Error
306 Ошибочный тип параметра сети Занесение номера в Error

Стандарт первого уровня компонента интерпретатор ответа

Данный раздел посвящен описанию стандарта записи на диск компонента интерпретатор ответов. Построение интерпретатора происходит в редакторе интерпретаторов ответа. Интерпретатор ответа всегда является составным, даже если выходом является один ответ. В состав этого объекта входят частные интерпретаторы. Кроме того, описание интерпретатора должно включать в себя правила распределения выходных сигналов сети между частными интерпретаторами и расположения ответов частных интерпретаторов в едином массиве ответов. Таким образом, интерпретатор ответа при выполнении запроса на интерпретацию массива выходных сигналов сети получает на входе массив выходных сигналов сети, а возвращает два массива – ответов и коэффициентов уверенности.

Каждый частный интерпретатор ответа получает на входе массив сигналов (возможно из одного элемента), которые он интерпретирует, а на выходе возвращает два числа – ответ и коэффициент уверенности в этом ответе.

В табл. 28 приведен список ключевых слов, специфических для языка описания интерпретатора ответов. Наиболее часто встречающиеся интерпретаторы объявлены стандартными. Для стандартных интерпретаторов описание частных интерпретаторов отсутствует. Список стандартных интерпретаторов приведен в табл. 29.

Таблица 28.

Ключевые слова языка описания интерпретаторов ответа.

Ключевоеслово Краткое описание
Answer Ответ.
Connections Начало блока описания распределения сигналов и ответов.
Contents Начало блока описания состава интерпретатора.
Include Предшествует имени файла, целиком вставляемого в это место описания.
Interpretator Заголовок раздела файла, содержащий описание интерпретатор.
NumberOf Функция. Возвращает число интерпретируемых частным интерпретатором сигналов.
Reliability Коэффициент уверенности.
Signals Имя, по которому адресуются интерпретируемые сигналы; начало блока описания сигналов.
SetParameters Процедура установления значений параметров.

Таблица 29.

Стандартные частные интерпретаторы.

Название Параметры Аргументы Описание
Empty B – множитель
C – смещение
  Интерпретирует один сигнал А. Ответом является величина О=А*В+С
Binary E – уровень надежности N – число сигналов (классов) Кодирование номером канала. Знаковый интерпретатор
Major E – уровень надежности N – число сигналов (классов) Кодирование номером канала. Максимальный интерпретатор.
BynaryCoded E – уровень надежности N – число сигналов (классов) Двоичный интерпретатор.

БНФ языка описания интерпретатора

Обозначения, принятые в данном расширении БНФ и описание ряда конструкций приведены в разделе «Описание языка описания компонентов».

<Описание интерпретатора> ::= <Заголовок> [<Описание функций>] <Описание частных интерпретаторов> <Описание состава> [<Установление параметров>] [<Описание сигналов>] [<Описание распределения сигналов>] [<Описание распределения ответов>] <Конец описания интерпретатора>

<Заголовок> ::= Interpretator <Имя интерпретатора>

<Имя интерпретатора>::= <Идентификатор>

<Описание частных интерпретаторов> ::= <Описание частного интерпретатора> [<Описание частных интерпретаторов>]

<Описание частного интерпретатора> ::= <Заголовок описания интерпретатора> [<Описание статических переменных >] [<Описание переменных>] <Тело интерпретатора>

<Заголовок описания интерпретатора> ::= Inter <Имя частного интерпретатора> : (<Список формальных аргументов>)

<Имя частного интерпретатора> ::= <Идентификатор>

<Тело интерпретатора> ::= Begin <Составной оператор> End

<Описание состава> ::= Contents <Список имен интерпретаторов> ;

<Список имен интерпретаторов> ::= <Имя интерпретатора> [,<Список имен интерпретаторов >]

<Имя интерпретатора> ::= <Псевдоним>: {<Имя ранее описанного интерпретатора> | <Имя стандартного интерпретатора>} [[<Число экземпляров >]][(<Список фактических аргументов>)]

<Псевдоним> ::= <Идентификатор>

<Число экземпляров > ::= <Целое число>

<Имя ранее описанного интерпретатора> ::= <Идентификатор>

<Имя стандартного интерпретатора> ::= <Идентификатор>

<Установление параметров> ::= <Установление параметров Частного интерпретатора> [;<Установление параметров>]

<Описание сигналов> ::= Signals <Константное выражение типа Long>

<Описание распределения сигналов> ::= <Описание распределения Сигналов, Интерпретатора, Частного интерпретатора, Signals>

<Описание распределения ответов> ::= <Описание распределения Ответов, Интерпретатора, Частного интерпретатора, Answer>

<Конец описания интерпретатора> ::= End Interpretator

Описание языка описания интерпретаторов

Структура описания интерпретатора имеет вид: заголовок, описание частных интерпретаторов, описание состава, описание сигналов, описание распределения сигналов, описание распределения ответов, конец описания интерпретатора.

Заголовок состоит из ключевого слова Interpretator è имени интерпретатора и служит для обозначения начала описания интерпретатора в файле, содержащем несколько компонентов нейрокомпьютера.

Описание частного интерпретатора – это описание процедуры, вычисляющей две величины: ответ и уверенность в ответе. Отметим, что уверенность в ответе имеет смысл только для оценок с уровнем надежности. В остальных случаях интерпретатор ответа может вычислять аналогичную величину, но эта величина не является коэффициентом уверенности в ответе в точном смысле. Отметим, что при описании частного интерпретатора его аргументом, как правило, является число интерпретируемых сигналов. При выполнении частный интерпретатор получает в качестве аргументов массив интерпретируемых сигналов и две действительные переменные для возвращения вычисленных ответа и уверенности в ответе. Формально, при исполнении, частный интерпретатор имеет описание следующего вида:

Pascal:

Procedure Interpretator(Signals : PRealArray; Var Answer, Reliability : Real);

C:

void Interpretator(PRealArray Signals, Real* Answer, Real* Reliability);

В разделе описания состава перечисляются частные интерпретаторы, входящие в состав интерпретатора. Признаком конца раздела служит символ «;».

В необязательном разделе установления параметров производится задание значений параметров (статических переменных) частных интерпретаторов. После ключевого слова SetParameters следует список значений параметров в том порядке, в каком параметры были объявлены при описании частного интерпретатора (для стандартных интерпретаторов порядок параметров указан в табл. 29). При использовании одного оператора задания параметров для задания параметров нескольким экземплярам одного частного интерпретатора после ключевого слова SetParameters указывается столько выражений, задающих значения параметров, сколько необходимо для одного экземпляра. Например, если в блоке описания состава содержится 10 экземпляров двоичного интерпретатора на 15 интерпретируемых сигналов – MyInt : BinaryCoded(15)[10], то после ключевого слова SetParameters должно быть только одно выражение:

MyInt[I:1..10] SetParameters 0.01*I

В данном примере первый интерпретатор будет иметь уровень надежности равный 0.01, второй – 0.02 и т.д.

В необязательном разделе описание сигналов указывается число сигналов, интерпретируемых интерпретатором. Если этот раздел опущен, то полагается, что число интерпретируемых интерпретатором сигналов равно сумме сигналов, интерпретируемых всеми частными интерпретаторами. В константном выражении может вызываться функция NumberOf, аргументом которой является имя частного интерпретатора (или его псевдоним) с указанием фактических аргументов.

В необязательном разделе описания распределения сигналов для каждого частного интерпретатора указывается, какие сигналы из общего интерпретируемого массива передаются ему для интерпретации. Если этот раздел отсутствует, то считается, что каждый следующий частный интерпретатор получает следующий фрагмент общего вектора выходных сигналов. В примере 1 данный раздел описывает распределение сигналов по умолчанию.

В необязательном разделе описания распределения ответов для каждого частного интерпретатора указывается, какой элемент массива ответов он вычисляет. Если этот раздел опущен, то считается, что первый частный интерпретатор вычисляет первый элемент массива ответов, второй – второй элемент и т.д. Массив уровней надежностей всегда параллелен массиву ответов. В примере 1 данный раздел описывает распределение ответов по умолчанию.

Кроме того, в любом месте описания интерпретатора могут встречаться комментарии, заключенные в фигурные скобки.

Пример описания интерпретатора

В этом разделе приведены два примера описания одного и того же интерпретатора следующего состава: первый сигнал интерпретируется как температура путем умножения на 10 и добавления 273; следующие два сигнала интерпретируются как наличие облачности, используя знаковый интерпретатор; следующие три сигнала интерпретируются как направление ветра, используя двоичный интерпретатор (восемь румбов); последние три сигнала интерпретируются максимальным интерпретатором как сила осадков (без осадков, слабые осадки, сильные осадки). В первом примере приведено описание дубликатов всех стандартных интерпретаторов. Во втором – использованы стандартные интерпретаторы.

Пример 1.

Interpretator Meteorology

{Интерпретатор осуществляющий масштабирование и сдвиг сигнала}

Inter Empty1 ()    

      Static

             Real B Name "Масштабный множитель";

             Real C Name "Сдвиг начала отсчета";

      Begin

             Answer = Signals[1] * B + C;

             Reliability = 0

      End

{Кодирование номером канала. Знаковый интерпретатор}

Inter Binary1 : ( N : Long )

      Static

             Real E Name "Уровень надежности";

      Var

             Long A, B, I;

             Real Dist;

      Begin

             Dist = E;

             B = 0;               {Число единиц}

             A = 0;              {Номер единицы}

             For I = 1 To N Do Begin

                   If Abs(Signals[I]) < Dist Then Dist = Abs(Signals[I]);

                   If Signals[I] > 0 Then Begin A = I; B = B + 1; End;

             End;

             If B <> 1 Then Answer = 0 Else Answer = A

             Reliability = Abs(Dist / E)

      End

{Кодирование номером канала. Максимальный интерпретатор.}

Inter Major1 : ( N : Long)

      Static

             Real E Name "Уровень надежности";

      Var

             Real A, B;

             Long I, J;

      Begin

             A = -1.E+30;                      {Максимальный сигнал}

             B = -1.E+30;                       {Второй по величине сигнал}

             J = 0;                                   {Номер максимального сигнала}

             For I = 1 To N Do Begin

                   If Signals[I] > A Then Begin B = A; A = Signals[I]; J=I; End

                   Else If Signals[I] > B Then B = Signals[I];

             End;

             Answer = J;

             If A – B > E Then Reliability = 1 Else Reliability = (A – B) / E;

      End

Inter BynaryCoded1 : ( N : Long )

      Static

             Real E Name "Уровень надежности";

      Var

             Long A, I;

             Real Dist;

      Begin

             Dist = E;

             A = 0;              {Ответ}

             For I = 1 To N Do Begin

                   If Abs(Signals[I]) < Dist Then Dist = Abs(Signals[I]);

                   A = A * 2;

                   If Signals[I] > 0 Then A = A + 1;

             End;

             Answer = A;

             Reliability = Abs(Dist / E)

      End

Contents Temp : Empty1, Cloud : Binary1(2), Wind : BynaryCoded1(3),

                   Rain : Major1(3);

Temp SetParameters 10, 273;

Cloud SetParameters 0.1;

Wind SetParameters 0.2;

Rain SetParameters 0.15

Signals NumberOf(Signals,Temp) + NumberOf(Signals, Cloud) +

1                 NumberOf(Signals, Wind) + NumberOf(Signals, Rain)

Connections

      Temp.Signals <=> Signals[1];

      Cloud.Signals[1..2] <=> Signals[2; 3];

      Wind.Signals[1..3] <=> Signals[4..6];

      Rain.Signals[1..3] <=> Signals[7..9]

      Temp.Answer <=> Answer[1];

      Cloud.Answer[1..2] <=> Answer[2];

      Wind.Answer[1..3] <=> Answer[3];

      Rain.Answer[1..3] <=> Answer[4]

End Interpretator

Пример 2.

Interpretator Meteorology

Contents Temp : Empty, Cloud : Binary(2), Wind : BynaryCoded(3), Rain : Major(3);

Temp SetParameters 10, 273;

Cloud SetParameters 0.1;

Wind SetParameters 0.2;

Rain SetParameters 0.15

End Interpretator

Стандарт второго уровня компонента интерпретатор ответа

Запросы к компоненту интерпретатор ответа можно разбить на пять групп:

  1. Интерпретация.
  1. Изменение параметров.
  1. Работа со структурой.
  1. Инициация редактора и конструктора интерпретатора ответа.
  1. Обработка ошибок.

Поскольку нейрокомпьютер может работать одновременно с несколькими сетями, то и компонент интерпретатор ответа должен иметь возможность одновременной работы с несколькими интерпретаторами. Поэтому большинство запросов к интерпретатору содержат явное указание имени интерпретатора ответа. Ниже приведено описание всех запросов к компоненту интерпретатор ответа. Каждый запрос является логической функцией, возвращающей значение истина, если запрос выполнен успешно, и ложь – при ошибочном завершении исполнения запроса.

В запросах второй и третьей группы при обращении к частным интерпретаторам используется следующий синтаксис:

<Полное имя частного интерпретатора> ::=

<Имя интерпретатора>.<Псевдоним частного интерпретатора> [[<Номер экземпляра>]]

При вызове ряда запросов используются предопределенные константы. Их значения приведены в табл. 30.

Таблица 30.

Значения предопределенных констант компонентов интерпретатор ответа и оценка

Название Величина Значение
Empty 0 Интерпретирует один сигнал как действительное число.
Binary 1 Кодирование номером канала. Знаковый интерпретатор
Major 2 Кодирование номером канала. Максимальный интерпретатор.
BynaryCoded 3 Двоичный интерпретатор.
UserType -1 Интерпретатор, определенный пользователем.

Запрос на интерпретацию

Единственный запрос первой группы выполняет основную функцию компонента интерпретатор ответа – интерпретирует массив сигналов.

Интерпретировать массив сигналов (Interpretate)

Описание запроса:

Pascal:

Function Interpretate( IntName : PString; Signals : PRealArray;

Var Reliability, Answers : PRealArray ) : Logic;

C:

Logic Interpretate(PString IntName, PRealArray Signals, PRealArray* Reliability, PRealArray* Answers)

Описание аргумента:

IntName – указатель на строку символов, содержащую имя интерпретатора ответа.

Signals – массив интерпретируемых сигналов.

Answers – массив ответов.

Reliability – массив коэффициентов уверенности в ответе.

Назначение – интерпретирует массив сигналов Signals, используя интерпретатор ответа, указанный в параметре IntName.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента IntName дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первый интерпретатор ответа в списке интерпретаторов компонента интерпретатор.
  1. Если список интерпретаторов компонента интерпретатор пуст или имя интерпретатора ответа, переданное в аргументе IntName в этом списке не найдено, то возникает ошибка 501 – неверное имя интерпретатора ответа, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Производится интерпретация ответа интерпретатором ответа, имя которого было указано в аргументе IntName.
  1. Если во время выполнения запроса возникает ошибка, то генерируется внутренняя ошибка 504 – ошибка интерпретации. Управление передается обработчику ошибок. Выполнение запроса прекращается. В противном случае выполнение запроса успешно завершается.

Остальные запросы

Ниже приведен список запросов, исполнение которых описано в разделе «Общий стандарт»:

aiSetCurrent – Сделать интерпретатор ответа текущим

aiAdd – Добавление нового интерпретатора ответа

aiDelete – Удаление интерпретатора ответа

aiWrite – Запись интерпретатора ответа

aiGetStructNames – Вернуть имена частных интерпретаторов

aiGetType – Вернуть тип частного интерпретатора

aiGetData – Получить параметры частного интерпретатора

aiGetName – Получить имена параметров частного интерпретатора

aiSetData – Установить параметры частного интерпретатора

aiEdit – Редактировать интерпретатор ответа

OnError – Установить обработчик ошибок

GetError – Дать номер ошибки

FreeMemory – Освободить память

В запросе aiGetType в переменной TypeId возвращается значение одной из предопределенных констант, перечисленных в табл. 30.

При исполнении запроса aiSetData генерируется запрос SetEstIntParameters к компоненте оценка. Аргументы генерируемого запроса совпадают с аргументами исполняемого запроса

Ошибки компонента интерпретатор ответа

В табл. 31 приведен полный список ошибок, которые могут возникать при выполнении запросов компонентом интерпретатор ответа, и действия стандартного обработчика ошибок.

Таблица 31.

Ошибки компонента интерпретатор ответа и действия стандартного обработчика ошибок.

Название ошибки Стандартная обработка
501 Неверное имя интерпретатора ответа Занесение номера в Error
502 Ошибка считывания интерпретатора ответа Занесение номера в Error
503 Ошибка сохранения интерпретатора ответа Занесение номера в Error
504 Ошибка интерпретации Занесение номера в Error

Стандарт первого уровня компонента оценка

Данный раздел посвящен описанию стандарта хранения на диске описания компонента оценка. Построение оценки происходит в редакторе оценок. В данном стандарте предлагается ограничиться рассмотрением только локальных оценок, поскольку использование нелокальных (глобальных) оценок сильно усложняет компонент оценка, а область применения нелокальных оценок узка по сравнению с локальными оценками.

Оценка всегда является составной, даже если ответом сети является одна величина. В состав этого объекта входят частные оценки. Кроме того, в описание оценки включаются правила распределения выходных сигналов сети между частными оценками и расположения оценок, вычисляемых частными оценками, в едином массиве оценок. Кроме того, различные частные оценки могут иметь разную значимость. В этом случае общая оценка определяется как сумма частных оценок с весами, задающими значимость.

Таким образом, оценка при выполнении запроса на оценивание массива выходных сигналов сети получает на входе массив выходных сигналов сети, массив правильных ответов и массив их достоверностей, а возвращает два массива – массив оценок и массив производных оценки по выходным сигналам сети – и величину суммарной оценки. Возможны два режима оценивания: оценивание без вычисления массива производных оценки по выходным сигналам сети, и оценивание с вычислением массива производных.

Каждая частная оценка получает на входе свой массив сигналов (возможно из одного элемента), правильный ответ и его достоверность, а на выходе вычисляет оценку и, при необходимости, массив производных оценки по выходным сигналам сети.

В табл. 32 приведен список ключевых слов специфических для языка описания оценок. Наиболее часто встречающиеся частные оценки объявлены стандартными. Для стандартных оценок описание частных оценок отсутствует. Список стандартных оценок приведен в табл. 33.

Таблица 32

Ключевые слова языка описания оценок.

Ключевое слово Краткое описание
Answer Правильный ответ.
Back Массив производных оценки по оцениваемым сигналам.
Contents Начало блока описания состава оценки.
Direv Признак необходимости вычисления производных.
Est Заголовок описания частной оценки.
Estim Переменная действительного типа, для возвращения вычисленной оценки.
Estimation Заголовок раздела файла, содержащий описание оценки.
Include Предшествует имени файла, целиком вставляемого в это место.
Link Указывает интерпретатор ответа, связанный с оценкой.
NumberOf Функция. Возвращает число интерпретируемых частным интерпретатором сигналов.
Reliability Достоверность правильного ответа.
Signals Имя, по которому адресуются интерпретируемые сигналы; начало блока описания сигналов.
Weight Вес частной оценки.
Weights Начало блока описания весов частных оценок.

Таблица 33

Стандартные частные оценки.

Название Параметры Аргументы Описание
Empty B – множитель
C – смещение
  Оценивает один сигнал А, вычисляя расстояние до правильного ответа с учетом нормировки.
Binary E – уровень надежности N – число сигналов. Кодирование номером канала. Соответствует знаковому интерпретатору.
Major E – уровень надежности N – число сигналов. Кодирование номером канала. Соответствует максимальному интерпретатору.
BynaryCoded E – уровень надежности N – число сигналов. Соответствует двоичному интерпретатору.

БНФ языка описания оценок

Обозначения, принятые в данном расширении БНФ и описание ряда конструкций приведены в разделе «Описание языка описания компонентов».

<Описание оценки> ::= <Заголовок> [<Описание функций>] <Описание частных оценок> <Описание состава> [<Связывание с интерпретаторами>] [<Установление параметров>] [<Описание весов>] [<Описание сигналов>] [<Описание распределения сигналов>] [<Описание распределения оценок>] <Конец описания оценки>

<Заголовок> ::= Estimation <Имя оценки>

<Имя оценки>::= <Идентификатор>

<Описание частных оценок> ::= <Описание частной оценки> [<Описание частных оценок>]

<Описание частной оценки> ::= <Заголовок описания оценки> [<Описание статических переменных>] [<Описание переменных>] <Тело оценки>

<Заголовок описания оценки> ::= Est <Имя частной оценки> (<Список формальных аргументов>)

<Имя частной оценки> ::= <Идентификатор>

<Тело оценки> ::= Begin <Составной оператор> End

<Описание состава> ::= Contents <Список имен оценок> ;

<Список имен оценок> ::= <Имя оценки> [,<Список имен оценок >]

<Имя оценки> ::= <Псевдоним>: {<Имя ранее описанной оценки> | <Имя стандартной оценки>} [(<Список фактических аргументов>)] [[<Число экземпляров>]]

<Псевдоним> ::= <Идентификатор>

<Число экземпляров > ::= <Целое число>

<Имя ранее описанной оценки> ::= <Идентификатор>

<Имя стандартной оценки> ::= <Идентификатор>

<Установление параметров> ::= <Установление параметров Частной оценки> [;<Установление параметров>]

<Связывание с интерпретаторами> ::= <Псевдоним> [[<Начальный номер> [..<Конечный номер> [:<Шаг>] ]]] Link <Псевдоним интерпретатора> [[<Начальный номер> [..<Конечный номер> [:<Шаг>] ]]]

<Псевдоним интерпретатора> ::= <Идентификатор>

<Описание весов> ::= Weights <Список весов>;

<Список весов> ::= <Вес> [,<Список весов>]

<Вес> ::= <Действительное число>

<Описание сигналов> ::= Signals <Константное выражение типа Long>

<Описание распределения сигналов> ::= <Описание распределения Сигналов, Оценки, Частной оценки, Signals>

<Описание распределения ответов> ::= <Описание распределения Ответов, Оценки, Частной оценки, Answer>

<Конец описания оценки> ::= End Estimation

Описание языка описания оценок

Структура описания оценки имеет вид: заголовок, описание функций, описание частных оценок, описание состава, описание связей с интерпретаторами, описание сигналов, описание распределения сигналов, описание распределения ответов, конец описания оценки.

Заголовок состоит из ключевого слова Estimation è имени оценки и служит для обозначения начала описания оценки в файле, содержащем несколько компонент нейрокомпьютера.

Описание частной оценки – это описание процедуры, вычисляющей оценку и, при необходимости, массив производных оценки по выходным сигналам сети. Отметим, что при описании частной оценки его аргументом, как правило, является число оцениваемых сигналов. При выполнении частная оценка получает в качестве аргументов массив оцениваемых сигналов, признак необходимости вычисления производных, правильный ответ, достоверность правильного ответа, действительную переменную для возвращения вычисленной оценки и массив для возвращения производных. Формально, при исполнении частная оценка имеет описание следующего вида:

Pascal:

Procedure Estimation(Signals, Back : PRealArray; Direv : Logic; Answer, Reliability : Real; Var Estim : Real);

C:

void Estimation(PRealArray Signals, PRealArray Back,

Logic Direv, Real Answer, Real Reliability, Real* Estim);

Отметим одну важную особенность выполнения тела частной оценки. Оператор присваивания значения элементу массива производных, означает добавление этого значения к величине, ранее находившейся в этом массиве. Например, запись Back[I] = A, означает выполнение следующего оператора Back[I] = Back[I] + A. Это связано с тем, что один и тот же сигнал может быть задействован в нескольких частных оценках и производная общей функции оценки равна сумме производных частных оценок по этому сигналу.

В разделе описания состава перечисляются частные оценки, входящие в состав оценки. Признаком конца раздела служит символ «;».

В необязательном разделе установления параметров производится задание значений параметров частных оценок. После ключевого слова SetParameters следует список значений параметров в том порядке, в каком параметры (статические переменные) были объявлены при описании частной оценки (для стандартных оценок порядок параметров указан в табл. 33). При использовании одного оператора задания параметров для задания параметров нескольким экземплярам одной частной оценки после ключевого слова SetParameters указывается столько выражений, задающих значения параметров, сколько необходимо для одного экземпляра. Например, если в блоке описания состава содержится 10 экземпляров двоичной оценки на 15 оцениваемых сигналов – MyEst : BinaryCoded(15)[10], то после ключевого слова SetParameters должно быть только одно выражение:

MyEst[I:1..10] SetParameters 0.01*I

В данном примере первая оценка будет иметь уровень надежности равный 0.01, вторая – 0.02 и т.д.

В необязательном разделе описания связей с интерпретаторами можно указать интерпретатор ответа, связанный с данной оценкой. Для связи интерпретатор и оценка должны иметь одинаковое число параметров и одинаковый порядок их описания. Так, в приведенном ниже примере, невозможно связывание оценки Temp с одноименным интерпретатором из-за различия в числе параметров. Если в левой части выражения Link указан диапазон оценок, то в правой части должен быть указан диапазон, содержащий столько же интерпретаторов. Указание связи влечет идентичность параметров оценки и связанного с ней интерпретатора ответов. Идентичность обеспечивается при исполнении запросов aiSetData и esSetData.

В необязательном разделе описания весов указываются веса частных оценок. Если этот раздел опущен, то все частные оценки равны единице, то есть все частные оценки имеют равную значимость.

В необязательном разделе описания сигналов указывается число сигналов, оцениваемых всеми частными оценками. Если этот раздел опущен, то полагается, что число оцениваемых оценкой сигналов равно сумме сигналов, оцениваемых всеми частными оценками. В константном выражении может вызываться функция NumberOf, аргументом которой является имя частной оценки (или ее псевдоним) с указанием фактических аргументов.

В необязательном разделе описания распределения сигналов для каждой частной оценки указывается, какие сигналы из общего оцениваемого массива передаются ей для оценивания. Если этот раздел опущен, то считается, что каждая следующая частная оценка получает следующий фрагмент массива сигналов. Порядок следования частных оценок соответствует порядку их перечисления в разделе описания состава. В примере 1 раздел описания распределения сигналов задает распределение сигналов по умолчанию. Массив производных оценки по выходным сигналам сети параллелен массиву сигналов.

В необязательном разделе описания распределения ответов для каждой частной оценки указывается какой элемент массива ответов будет ей передан. Если этот раздел опущен, то считается, что каждая следующая частная оценка получает следующий элемент массива ответов. Порядок следования частных оценок соответствует порядку их перечисления в разделе описания состава. В примере 1 раздел описания распределения ответов задает распределение сигналов по умолчанию. Массивы достоверностей ответов и вычисленных оценок параллельны массиву ответов.

Кроме того, в любом месте описания оценки могут встречаться комментарии, заключенные в фигурные скобки.

Пример описания оценки

В этом разделе приведены два примера описания одной и той же оценки следующего состава: первый сигнал интерпретируется как температура путем умножения на 10 и добавления 273; следующие два сигнала интерпретируются как наличие облачности, используя знаковый интерпретатор; следующие три сигнала интерпретируются как направление ветра, используя двоичный интерпретатор (восемь румбов); последние три сигнала интерпретируются максимальным интерпретатором как сила осадков (без осадков, слабые осадки, сильные осадки). Для трех последних интерпретаторов используются соответствующие им оценки типа расстояние до множества. В первом примере приведено описание дубликатов всех стандартных оценок. Во втором – использованы стандартные оценки.

Пример 1.

Estimation Meteorology

Est Empty1 ()  {Оценка для интерпретатора, осуществляющего

                                            масштабирование и сдвиг сигнала}

      Static

             Real B Name "Масштабный множитель";

             Real C Name "Сдвиг начала отсчета";

             Real E Name "Требуемая точность совпадения";

      Var

             Real A;

      Begin

             A = Signals[1] – (Answer – C) / B;

             D = E * Reliability;    {Допуск определяем произведением}

             If Abs(A)<D Then Estim = 0

             Else

                   If A > 0 Then Begin

                         Estim = Weight * Sqr(A – D) / 2;

                         If Direv Then Back[1] = Weight * (A – D);

                   End Else Begin

                         Estim = Weight * Sqr(A + D) / 2;

                         If Direv Then Back[1] = Weight * (A + D);

                   End

      End

{Кодирование номером канала. Оценка для знакового интерпретатора.}

Est Binary1 ( N : Long)   

      Static

             Real E Name "Уровень надежности";

      Var

             Long I, J;

             Real A, B, C;

      Begin

             J = Answer;                       {Правильный ответ – номер правильного класса}

             B = 0;

             C = E * Reliability;    {Допуск определяем произведением}

             For I = 1 To N Do

                   If I = J Then Begin

                         If Signals[I] < С Then Begin

                                B = B + Sqr(Signals[I] – С);

                                If Direv Then Back[I] = 2 * Weight * (Signals[I]-С);

                         End;

                   End Else Begin

                         If Signals[I] > -C Then Begin

                                B = B + Sqr(Signals[I] + C);

                                If Direv Then Back[I] = 2 * Weight * (Signals[I] + C);

                         End

                   End;

             Estim = Weight*B

      End

{Кодирование номером канала. Оценка для максимального интерпретатора.}

Est Major1 ( N : Long)

      Static

             Real E Name "Уровень надежности";

      Var

             Real A, B;

             Long I, J, K, Ans;

             RealArray[N+1] Al,Ind;

      Begin

             Ans = Answer;

             Ind[1] = Ans;

             Al[1] = Signals[Ans] – E * Reliability;

             Ind[N+1] = 0;

             Al[N+1] = -1.e40;

             K:=1;

             For I = 1 To N Do

                   If I <> Ans Then Begin

                          Al[K] = Signals[I];

                          Ind[K] = I;

                          K = K + 1;

                    End;                                                {Подготовлен массив сигналов}

             For I = 2 To N-1 Do Begin

                   A = Al[I];

                   K = I;

                   For J = I+1 To N Do

                         If Al[J] > A Then Begin

                                K = J;

                                A = Al[J];

                         End;                                           {Найден следующий по величине}

                   Al[K] = Al[I];

                   Al[I] = A;

                   J = Ind[K];

                   Ind[K] = Ind[I];

                   Ind[I] = J;

             End;                                                       {Массивы отсортированы}

             A = Al[1];                                       {Сумма первых I членов}

             I = 1;

             While (A / I <= Al[I+1]) Do Begin

                   A = A + Al[I];

                   I = I + 1;

             End;                        {В конце цикла I-1 равно числу корректируемых сигналов}

             B = A / I;               {B – величина, к которой должны стремиться}

             A = 0;                     {корректируемые сигналы}

             For J = 1 To I Do Begin

                   A = A + Sqr(Al[J] – B);

                   If Direv Then Back[Ind[J]] = -2* Weight * (Al[J] – B);

             End;

             Estim = Weight * A

      End;

Est BynaryCoded1 : ( N : Long)        {Оценка для кодирования номером канала}

      Static

             Real E Name "Уровень надежности";

      Var

             Long I, J, A, K;

             Real B, C;

      Begin

             A = Answer;

             B = 0;

             C = E * Reliability;    {Допуск определяем произведением}

             For I = N To 1 By -1 Do Begin

                   J = A / 2;

                   K = A – 2 * J;

                   A = J;

                   If A = 1 Then Begin

                         If Signals[I] < C Then Begin

                                B = B + Sqr(Signals[I] – C);

                                If Direv Then Back[I] = 2 * Weight * (Signals[I]-C);

                         End;

                   End Else Begin

                         If Signals[I] > -C Then Begin

                                B = B + Sqr(Signals[I] + C);

                                If Direv Then Back[I] = 2 * Weight * (Signals[I] + C);

                         End;

                   End;

             Estim = Weight*B

      End

Contents Temp : Empty1, Cloud : Binary1(2), Wind : BynaryCoded1(3),

                         Rain : Major1(3);

Cloud Link Meteorology.Cloud             {Связываем оценки с интерпретаторами}

Wind Link Meteorology.Wind

Rain Link Meteorology.Rain

Temp SetParameters 10, 273;           {Устанавливаем значения параметров оценок}

Cloud SetParameters 0.1;                       {и интерпретаторов}

Wind SetParameters 0.2;

Rain SetParameters 0.15

Weights 1, 1, 1, 1

Signals NumberOf(Signals,Temp) + NumberOf(Signals, Cloud) +

                   NumberOf(Signals, Wind) + NumberOf(Signals, Rain)

Connections

      Temp.Signals <=> Signals[1];

      Cloud.Signals[1..2] <=> Signals[2; 3];

      Wind.Signals[1..3] <=> Signals[4..6];

      Rain.Signals[1..3] <=> Signals[7..9]

      Temp.Answer <=> Answer[1];

      Cloud.Answer[1..2] <=> Answer[2];

      Wind.Answer[1..3] <=> Answer[3];

      Rain.Answer[1..3] <=> Answer[4]

End Estimation

Пример 2.

Estimation Meteorology

Contents Temp : Empty, Cloud : Binary(2), Wind : BynaryCoded(3), Rain : Major(3);

Cloud Link Meteorology.Cloud             {Связываем оценки с интерпретаторами}

Wind Link Meteorology.Wind

Rain Link Meteorology.Rain

Temp SetParameters 10, 273;           {Устанавливаем значения параметров оценок}

Cloud SetParameters 0.1;                       {и интерпретаторов}

Wind SetParameters 0.2;

Rain SetParameters 0.15

End Estimation

Стандарт второго уровня компонента оценка

Запросы к компоненте оценка можно разбить на пять групп:

  1. Оценивание.
  1. Изменение параметров.
  1. Работа со структурой.
  1. Инициация редактора и конструктора оценки.
  1. Обработка ошибок.

Поскольку нейрокомпьютер может работать одновременно с несколькими сетями, то и компонент оценка должен иметь возможность одновременной работы с несколькими оценками. Поэтому большинство запросов к оценке содержат явное указание имени оценки. Ниже приведено описание всех запросов к компоненту оценка. Каждый запрос является логической функцией, возвращающей значение истина, если запрос выполнен успешно, и ложь – при ошибочном завершении исполнения запроса.

В запросах второй и третьей группы при обращении к частным оценкам используется следующий синтаксис:

<Полное имя частной оценки> ::= <Имя оценки>.<Псевдоним частной оценки> [[<Номер экземпляра>]]

При вызове ряда запросов используются предопределенные константы. Их значения приведены в табл. 30.

Запрос на оценивание

Единственный запрос первой группы выполняет основную функцию компонента оценка – вычисляет оценку и, если требуется, массив производных оценки по оцениваемым сигналам.

Оценить массив сигналов (Estimate)

Описание запроса:

Pascal:

Function Estimate( EstName : PString; Signals, Back, Answers, Reliability: PRealArray; Direv : Logic; Var Estim : Real ) : Logic;

C:

Logic Estimate(PString EstName, PRealArray Signals, PRealArray* Back, PRealArray Answers, PRealArray Reliability, Logic Direv, Real* Estim)

Описание аргумента:

EstName – указатель на строку символов, содержащую имя оценки.

Signals – указатель на массив оцениваемых сигналов.

Back – указатель на массив производных оценки по оцениваемым сигналам.

Answers – указатель на массив правильных ответов.

Reliability – указатель на массив äîñòîâåðíîñòåé ïðàâèëüíûõ îòâåòîâ.

Direv – ïðèçíàê íåîáõîäèìîñòè âû÷èñëåíèÿ ïðîèçâîäíûõ (False – не вычислять).

Estim – âû÷èñëåííàÿ îöåíêà.

Назначение – вычисляет оценку массива сигналов Signals, используя оценку, указанную в параметре EstName.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в качестве аргумента EstName дан пустой указатель, или указатель на пустую строку, то исполняющим запрос объектом является первая оценка в списке оценок компонента оценка.
  1. Если список оценок компонента оценка пуст или имя оценки, переданное в аргументе EstName, в этом списке не найдено, то возникает ошибка 401 – неверное имя оценки, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Производится вычисление оценки оценкой, имя которой было указано в аргументе EstName.
  1. Если во время выполнения запроса возникает ошибка, то генерируется внутренняя ошибка 404 – ошибка оценивания. Управление передается обработчику ошибок. Выполнение запроса прекращается. В противном случае выполнение запроса успешно завершается.

Остальные запросы

Ниже приведен список запросов, исполнение которых описано в разделе «Общий стандарт»:

esSetCurrent – Сделать оценку текущим

esAdd – Добавление новой оценки

esDelete – Удаление оценки

esWrite – Запись оценки

esGetStructNames – Вернуть имена частных оценок

esGetType – Вернуть тип частной оценки

esGetData – Получить параметры частной оценки

esGetName – Получить имена параметров частной оценки

esSetData – Установить параметры частной оценки

esEdit – Редактировать оценку

OnError – Установить обработчик ошибок

GetError – Дать номер ошибки

FreeMemory – Освободить память

В запросе esGetType в переменной TypeId возвращается значение одной из предопределенных констант, перечисленных в табл. 30.

Кроме того, во второй группе запросов есть запрос SetEstIntParameters аналогичный запросу esSetData, но определяющий частную оценку, параметры которой изменяются, по полному имени связанного с ней интерпретатора ответа.

Установить параметры (SetEstIntParameters)

Описание запроса:

Pascal:

Function SetEstIntParameters( IntName : PString; Param : PRealArray ) : Logic;

C:

Logic SetEstIntParameters(PString IntName, PRealArray Param)

Описание аргументов:

IntName – указатель на строку символов, содержащую полное имя частного интерпретатора ответа.

Param – адрес массива параметров.

Назначение – заменяет значения параметров частной оценки, связанной с интерпретатором ответа, указанного в аргументе IntName, на значения, переданные, в аргументе Param.

Описание исполнения.

  1. Запрос передается всем частным оценкам всех оценок в списке оценок компонента оценка.
  1. Если частная оценка связана с частным интерпретатором ответа, имя которого указано в аргументе IntName, то текущие значения параметров частной оценки заменяются на значения, хранящиеся в массиве, адрес которого передан в аргументе Param,.

Ошибки компонента оценка

В табл. 34 приведен полный список ошибок, которые могут возникать при выполнении запросов компонентом оценка, и действия стандартного обработчика ошибок.

Таблица 34.

Ошибки компонента оценка и действия стандартного обработчика ошибок.

Название ошибки Стандартная обработка
401 Неверное имя оценки Занесение номера в Error
402 Ошибка считывания оценки Занесение номера в Error
403 Ошибка сохранения оценки Занесение номера в Error
404 Ошибка вычисления оценки Занесение номера в Error

Стандарт второго уровня компонента исполнитель

В данном разделе описаны запросы исполнителя с алгоритмами их исполнения. При описании запросов используется аргумент Instruct, являющийся целым числом, принимающим значение одной из предопределенных констант, приведенных в табл. 35., или суммы любого числа этих констант. Аргумент Instruct является совокупностью шести битовых флагов.

Таблица 35

Предопределенные константы компонента исполнитель

Название Идентификатор Значение  
Десят. Шестн.
Вычислять оценку Estimate 1 H0001
Интерпретировать ответ Interpret 2 H0002
Вычислять градиент Gradient 4 H0004
Подготовка к контрастированию Contrast 8 H0008
Перейти к следующему примеру NextExample 16 H0010
Остановиться в конце обучающего множества StopOnEnd 32 H0020
Устанавливать ответы PutAnswers 64 H0040
Устанавливать оценки PutEstimations 128 H0080
Устанавливать уверенность в ответе PutReliability 256 H0100

В запросах не указываются используемые сеть, оценка и интерпретатор ответа, поскольку компонент исполнитель всегда использует текущие сеть, оценку и интерпретатор ответа.

Позадачная обработка (TaskWork)

Описание запроса:

Pascal:

Function TaskWork(Instruct, Handle : Integer; Var Answers, Reliability : PRealArray; Var Estim : Real) : Logic;

C:

Logic TaskWork(Integer Instruct, Integer Handle, PRealArray* Answers, PRealArray* Reliability; Real* Estim)

Описание аргументов:

Instruct – содержит инструкции о способе исполнения.

Handle – номер сеанса в задачнике.

Answers – указатель на массив вычисленных ответов.

Reliability – указатель на массив коэффициентов уверенности сети в ответах.

Estim – оценка решения примера.

Назначение – производит обработку одного примера.

Переменные, используемые при исполнении запроса

InArray, RelArray – адреса массивов для обменов с задачником.

Back – адрес массива для обменов с оценкой.

Описание исполнения.

Если в любой момент исполнения запроса возникает ошибка при исполнении запросов к другим компонентам, то исполнение запроса прекращается, возвращается значение ложь, ошибка компонента исполнитель не генерируется.

  1. Если в аргументе Instruct установлен бит Gradient и не установлен бит Estimate, то выполнение запроса прекращается, и генерируется ошибка 001 – Некорректное сочетание флагов в аргументе Instruct.
  1. Если в аргументе Instruct установлен бит Gradient, то генерируется запрос к сети NullGradient с аргументом Null.
  1. Если в аргументе Instruct установлен бит NextExample, то генерируется запрос к задачнику Next с аргументом Handle. (Переход к следующему примеру)
  1. Генерируется запрос к задачнику Last с аргументом Handle. (Проверка, существует ли пример)
  1. Если запрос Last вернул значение истина, то
    1. Если в аргументе Instruct установлен бит StopOnEnd, то исполнение запроса прекращается, возвращается значение ложь. (Примера нет, переход на начало не нужен)
    1. Генерируется запрос к задачнику Home с аргументом Handle. (Переход на начало обучающего множества)
  1. Переменной InArray присваивается значение Null и генерируется запрос к задачнику Get с аргументами Handle, InArray, tbPrepared (Получает от задачника предобработанные входные сигналы)
  1. Генерируется запрос к сети Forw, с аргументами Null, InArray (выполняется прямое функционирование сети).
  1. Освобождается массив InArray
  1. Присваивает переменной Data значение Null и генерирует запрос к сети GetNetData с аргументами Null, OutSignals, Data (Получает от сети выходные сигналы).
  1. Если в аргументе Instruct установлен бит Interpret, то
    1. Генерируется запрос к интерпретатору ответа Interpretate с аргументами Data, Answers, Reliability. (Производит интерпретацию ответа)
    1. Если в аргументе Instruct установлен бит PutAnswers, то генерируется запрос к задачнику Put с аргументами Handle, Answers, tbCalcAnswers (Передает задачнику вычисленные ответы)
    1. Если в аргументе Instruct установлен бит PutReliability, то генерируется запрос к задачнику Put с аргументами Handle, Reliability, tbCalcReliability (Передает задачнику вычисленные коэффициенты уверенности в ответе)
  1. Если в аргументе Instruct установлен бит Gradient, то создается массив Back того же размера, что и Data. В противном случае переменной Back присваивается значение Null.
  1. Если в аргументе Instruct установлен бит Estimate, то
    1. Переменной InArray присваивается значение Null и генерируется запрос к задачнику Get с аргументами Handle, InArray, tbAnswers (Получает от задачника правильные ответы)
    1. Переменной RelArray присваивается значение Null и генерируется запрос к задачнику Get с аргументами Handle, RelArray, tbCalcReliability(Получает от задачника достоверности ответов)
    1. Генерируется запрос к оценке Estimate с аргументами Data, Back, InArray, RelArray, Direv, Estim. Вместо Direv передается ноль, если в аргументе Instruct установлен бит Gradient, и 1 в противном случае. (Вычисляет оценку примера и, возможно, производные)
    1. Если в аргументе Instruct установлен бит PutEstimations, то генерируется запрос к задачнику Put с аргументами Handle, Estim, tbEstimations (Передает задачнику оценку примера)
    1. Освобождает массивы InArray и RelArray.
  1. Если в аргументе Instruct установлен бит Gradient, то генерируется запрос к сети Back, с аргументами Null, Back. Освобождает массив Back. (Выполняется обратное функционирование сети)
  1. Освобождается массив Data.
  1. Если в аргументе Instruct установлен бит Contrast, то генерируется запрос к контрастеру ContrastExample с аргументом истина.
  1. Завершает исполнение, возвращая значение истина

Обработка обучающего множества (TaskSetWork)

Описание запроса:

Pascal:

Function TaskSetWork(Instruct, Handle : Integer; Var Tasks : Integer; Var Correct : PRealArray; Var Estim : Real) : Logic;

C:

Logic TaskSetWork(Integer Instruct, Integer Handle, Integer* Tasks, PRealArray* Correct, Real* Estim)

Описание аргументов:

Instruct – содержит инструкции о способе исполнения.

Handle – номер сеанса в задачнике.

Tasks – число примеров в обучающем множестве.

Correct – указатель на массив, первый элемент которого равен числу правильных ответов на первую подзадачу и т.д.

Estim – средняя оценка решения всех примеров обучающего множества.

Назначение – производит обработку всех примеров обучающего множества.

Переменные, используемые при исполнении запроса

InArray, AnsArray, RelArray – адреса массивов для обменов с задачником.

Answers – указатель на массив вычисленных ответов.

Reliability – указатель на массив коэффициентов уверенности сети в ответах.

Back – адрес массива для обменов с оценкой.

Work – рабочая переменная типа Real для подсчета суммарной оценки.

Weight – рабочая переменная типа Real для веса примера.

Описание исполнения.

Если в любой момент исполнения запроса возникает ошибка при исполнении запросов к другим компонентам, то исполнение запроса прекращается, освобождаются все созданные в нем массивы, возвращается значение ложь, ошибка компонента исполнитель не генерируется.

Значение бит NextExample и StopOnEnd в аргументе Instruct игнорируются.

  1. Если в аргументе Instruct установлен бит Gradient и не установлен бит Estimate, то выполнение запроса прекращается, и генерируется ошибка 001 – Некорректное сочетание флагов в аргументе Instruct.
  1. Если в аргументе Instruct установлен бит Interpret, то создаются массивы Answers и Reliability того же размера, что и Correct
  1. Выполняется следующий фрагмент программы (Обнуление массива количеств правильных ответов)
    1. For  I = 1 To TLong(Correct[0]) Do
    1.   Correct[I] = 0
  1. Обнуляем счетчик числа примеров:  Tasks = 0
  1. Обнуляем суммарную оценку: Work = 0
  1. Переменной Back присваивается значение Null.
  1. Присваивает переменной Data значение Null и генерирует запрос к сети GetNetData с аргументами Null, OutSignals, Data. (Получает от сети выходные сигналы, для выяснения размерности массива Data. Сами значения сигналов не нужны)
  1. Если в аргументе Instruct установлен бит Gradient, то
    1. Генерируется запрос к сети NullGradient с аргументом Null.
    1. Создается массив Back того же размера, что и Data.
  1. Генерируется запрос к задачнику Home с аргументом Handle. (Переход на начало обучающего множества)
  1. Переменной InArray присваивается значение Null и генерируется запрос к задачнику Get с аргументами Handle, InArray, tbPrepared (Создаем массив InArray для получения от задачника предобработанных входных сигналов)
  1. Переменной AnsArray присваивается значение Null и генерируется запрос к задачнику Get с аргументами Handle, AnsArray, tbAnswers (Создаем массив AnsArray для получения от задачника правильных ответов)
  1. Если в аргументе Instruct установлен бит Estimate, то создается массив RelArray того же размера, что и AnsArray.
  1. Генерируется запрос к задачнику Last с аргументом Handle. (Проверка, существует ли пример)
  1. Если запрос Last вернул значение ложь, то
    1. Tasks = Tasks + 1
    1. Генерируется запрос к задачнику Get с аргументами Handle, InArray, tbPrepared (Получает от задачника предобработанные входные сигналы)
    1. Генерируется запрос к сети Forw, с аргументами Null, InArray. (Выполняется прямое функционирование сети)
    1. Генерирует запрос к сети GetNetData с аргументами Null, OutSignals, Data. (Получает от сети выходные сигналы)
    1. Если в аргументе Instruct установлен бит Interpret, то
      1. Генерируется запрос к интерпретатору ответа Interpretate с аргументами Data, Answers, Reliability. (Производит интерпретацию ответа)
      1. Если в аргументе Instruct установлен бит PutAnswers, то генерируется запрос к задачнику Put с аргументами Handle, Answers, tbCalcAnswers (Передает задачнику вычисленные ответы)
      1. Если в аргументе Instruct установлен бит PutReliability, то генерируется запрос к задачнику Put с аргументами Handle, Reliability, tbCalcReliability (Передает задачнику вычисленные коэффициенты уверенности в ответе)
      1. Генерируется запрос к задачнику Get с аргументами Handle, AnsArray, tbAnswers (Получает от задачника правильные ответы)
      1. Выполняется следующий фрагмент программы (Подсчитываются правильно полученные ответы)
        1. For  I = 1 To TLong(Correct[0]) Do
        1.   If Answers[I] = AnsArray[I] Then TLong(Correct[I]) = TLong(Correct[I]) + 1
    1. Если в аргументе Instruct установлен бит Estimate, то
      1. Если в аргументе Instruct не установлен бит Interpret, то генерируется запрос к задачнику Get с аргументами Handle, AnsArray, tbAnswers (Получает от задачника правильные ответы)
      1. Генерируется запрос к задачнику Get с аргументами Handle, RelArray, tbCalcReliability (Получает от задачника достоверности ответов)
      1. Генерируется запрос к оценке Estimate с аргументами Data, Back, AnsArray, RelArray, Direv, Estim. Вместо Direv передается ноль, если в аргументе Instruct установлен бит Gradient, и 1 в противном случае. (Вычисляет оценку примера и, возможно, производные)
      1. Генерируется запрос к задачнику Get с аргументами Handle, Weight, tbWeight (Получает от задачника вес примера)
      1. Work = Work + Estim * Weight (Подсчитываем суммарную оценку)
      1. Если в аргументе Instruct установлен бит PutEstimations, то генерируется запрос к задачнику Put с аргументами Handle, Estim, tbEstimations (Передает задачнику оценку примера)
    1. Если в аргументе Instruct установлен бит Gradient, то генерируется запрос к сети Back, с аргументами Null, Back. (Выполняется обратное функционирование сети)
    1. Если в аргументе Instruct установлен бит Contrast, то генерируется запрос к контрастеру ContrastExample с аргументом ложь.
    1. Генерируется запрос к задачнику Next с аргументом Handle. (Переход к следующему примеру)
    1. Переход к шагу 13 алгоритма.
  1. Вычисляем среднюю оценку: If Tasks = 0 Then Estim = 0 Else Estim = Work / Task
  1. Если в аргументе Instruct установлен бит Contrast, то генерируется запрос к контрастеру ContrastExample с аргументом истина.
  1. Освобождаются массивы Data, AnsArray è InArray.
  1. Если в аргументе Instruct установлен бит Estimate, то освобождается массив и RelArray.
  1. Если в аргументе Instruct установлен бит Interpret, то освобождаются массивы Answers и Reliability.
  1. Если Back <> Null освобождается массив Back.
  1. Завершает исполнение, возвращая значение истина

Ошибки компонента исполнитель

В табл. 36 приведен полный список ошибок, которые могут возникать при выполнении запросов компонентом исполнитель, и действия стандартного обработчика ошибок.

Таблица 36.

Ошибки компонента исполнитель и действия стандартного обработчика ошибок.

Название ошибки Стандартная обработка
001 Некорректное сочетание флагов в аргументе Instruct. Занесение номера в Error

Стандарт первого уровня компонента учитель

В этом разделе приводится стандарт языка описания компонента учитель. Поскольку часть алгоритмов обучения жестко привязана к архитектуре сети, то в следующем разделе предложен способ опознания «своих» сетей.

Способ опознания сети для методов, привязанных к архитектуре сети

Для опознания типа сети рекомендуется использовать первый параметр сети. Для этого архитектуре сети приписывается уникальный номер, типа Long. Уникальность может поддерживаться, например, за счет использования генератора случайных чисел. Кроме того, при описании параметров сети следует задать отдельный тип параметров для первого параметра и указать минимальную границу равной максимальной и равной номеру архитектуры сети. Также необходимо указать в маске параметров, что этот параметр является необучаемым. Учитель, прежде чем выполнить любую операцию с сетью, читает параметры сети, и проверяет первый параметр сети, интерпретируемый как переменная типа Long, на совпадение с хранимым в учителе номером архитектуры. В случае несовпадения номера в параметрах сети с номером в учителе, учитель генерирует внутреннюю ошибку 601 – несовместимость сети и учителя.

Если учитель работает с сетями любой архитектуры, то процедура опознания архитектуры сети не нужна.

Список стандартных функций

В этом разделе описаны стандартные функции, специфические для компонента учитель. Эти функции соответствуют макросам, использованным в главе «Учитель». Заголовки функций даны на языке описания учителя.

Установить объект обучения (SetInstructionObject)

Заголовок функции:

Function SetInstructionObject (What : Integer; Net : PString) : Logic;

Описание аргументов

What может принимать следующие значения (предопределенные константы, приведенные в табл. 11):

Parameters – для обучения параметров сети;

InSignals – для обучения входных сигналов.

Net – имя нейронной сети, которая будет обучаться.

Возможно обучение одного из двух объектов – параметров сети или входных сигналов. Объект обучения должен быть задан до начала собственно обучения. По умолчанию обучается первая сеть в списке нейронных сетей компонента сеть. При необходимости в качестве объекта обучения может быть задана часть сети (см. главу «Описание нейронных сетей»). При сохранении учителя в файле сети объект обучения хранится вместе с учителем. Функция возвращает значение истина, если ее выполнение завершено успешно. В противном случае (например, указанная сеть отсутствует в списке сетей компонента сеть) возвращается значение ложь.

Создание массива (CreateArray)

Заголовок функции:

Function CreateArray : PRealArray;

Аргументов нет.

Функция возвращает указатель на массив, пригодный для хранения массива обучаемых параметров (входных сигналов) сети. Если массив создать не удалось, то возвращается пустой указатель.

Освободить массив (EraseArray)

Заголовок функции:

Function EraseArray( Vec : PRealArray) : Logic;

Описание аргументов

Vec – указатель на массив. При вызове содержит адрес освобождаемого массива.

После выполнения функции в аргументе Vec содержится пустой указатель. В случае невозможности освобождения памяти функция генерирует внутреннюю ошибку 604 – некорректная работа с памятью, передает управление обработчику ошибок, выполнение функции завершается, возвращается значение ложь. В противном случае возвращается значение истина.

Случайный массив (RandomArray)

Заголовок функции:

Function RandomArray(Vec : PRealArray) : Logic;

Описание аргументов

Vec – указатель на массив. При входе в макрос содержит адрес существующего массива.

В ходе выполнения функции для каждого элемента массива параметров генерируется случайное значение. Для генерации используется генератор случайных чисел, равномерно распределенных на отрезке от нуля до единицы. После получения случайной величины a она преобразуется по формуле  к случайной величине, распределенной на отрезке . Величины  и  для параметров сети определяются их типом (см. раздел «Описание элементов»). Для входных сигналов принимается , . Если обучаемым объектом являются параметры, то генерация случайного массива производится путем генерации запроса RandomDirection компонента сеть. Если при выполнении функции возникла ошибка, то генерируется внутренняя ошибка 605 – ошибка при исполнении внешнего запроса, управление передается обработчику ошибок, функция возвращает значение ложь. В противном случае возвращается значение истина.

Модификация массива (Modify)

Заголовок функции:

Function Modify(Direct : PRealArray; OldStep, NewStep : Real) : Logic;

Описание аргументов

Direct – указатель на массив направления модификации сети.

OldStep – вес старого массива параметров в модифицированном.

NewStep – вес массива направления модификации в модифицированном массиве параметров.

Эта функция генерирует запрос на модификацию параметров сети (см. раздел «Провести обучение (Modify)»). Вызов запроса имеет вид:

Modify( Net, OldStep, NewStep, Tipe, Direct )

Аргументами запроса являются:

Net – указатель на пустую строку (используется сеть по умолчанию).

OldStep, NewStep – аргументы функции.

Tipe – значение аргумента What в запросе InstructionObject.

Direct – аргумент функции.

Аргумент функции Direct может быть пустым указателем. В этом случае для модификации используется массив градиента, хранящийся вместе с сетью. В случае возникновения ошибки в ходе модификации сети (запрос Modify возвращает значение ложь) генерируется внутренняя ошибка 605 – ошибка при исполнении внешнего запроса, управление передается обработчику ошибок, функция возвращает значение ложь. В противном случае возвращается значение истина.

Оптимизация шага (Optimize)

Заголовок функции:

Function Optimize (Direct : PRealArray; Step : Real) : Real;

Описание аргументов

Direct – указатель на массив направления модификации сети.

Step – начальный шаг в направлении Direct.

Действия, выполняемые функцией Optimize, описаны в разделе «Подбор оптимального шага». В случае возникновения ошибки при выполнении функции она генерирует внутреннюю ошибку 605 – ошибка при исполнении внешнего запроса, передает управление обработчику ошибок, функция возвращает значение 0. В противном случае возвращается значение оценки при оптимальном шаге. Следует отметить, что после завершения выполнения функции, параметры сети соответствуют результату выполнения функции Modify(Direct, 1, Step), где Step – значение оптимального шага.

Сохранить массив (SaveArray)

Заголовок функции:

Function SaveArray(Vec : PRealArray) : Logic;

Описание аргументов

Vec – указатель на массив.

Функция генерирует запрос nwGetData. После выполнения функции в массиве, на который указывает аргумент Vec, содержится текущий массив параметров. В случае возникновения ошибки в ходе выполнения функции генерируется внутренняя ошибка 605 – ошибка при исполнении внешнего запроса, управление передается обработчику ошибок, функция возвращает значение ложь. В противном случае возвращается значение истина.

Установить параметры (SetArray)

Заголовок функции:

Function SetArray(Vec : PRealArray) : Logic;

Описание аргументов

Vec – указатель на массив, содержащий параметры, которые необходимо установить.

Функция генерирует запрос nwSetData.После выполнения функции параметры сети совпадают с параметрами, содержащимися в массиве, на который указывает аргумент Vec. В случае возникновения ошибки в ходе выполнения функции генерируется внутренняя ошибка 605 – ошибка при исполнении внешнего запроса, управление передается обработчику ошибок, функция возвращает значение ложь. В противном случае возвращается значение истина.

Вычислить оценку (Estimate)

Заголовок функции:

Function Estimate(Handle : Integer; All : Logic) : Real;

Описание аргументов

Handle – номер сеанса задачника.

All – признак обучения по всему обучающему множеству.

Функция генерирует запрос к исполнителю на вычисление оценки. Если аргумент All содержит значение истина, то обучение производится по всему обучающему множеству, в противном случае – позадачно. В случае возникновения ошибки при выполнении функции он генерирует внутреннюю ошибку 605 – ошибка при исполнении внешнего запроса, передает управление обработчику ошибок, функция возвращает значение 0. В противном случае возвращается значение вычисленной оценки.

Вычислить градиент (CalcGradient)

Заголовок функции:

Function CalcGradient(Handle : Integer; All : Logic) : Real;

Описание аргументов

Handle – номер сеанса задачника.

All – признак обучения по всему обучающему множеству.

Функция генерирует запрос к исполнителю на вычисление градиента. Если аргумент All содержит значение истина, то обучение производится по всему обучающему множеству, в противном случае – позадачно. В случае возникновения ошибки при выполнении функции он генерирует внутреннюю ошибку 605 – ошибка при исполнении внешнего запроса, передает управление обработчику ошибок, функция возвращает значение 0. В противном случае возвращается значение вычисленной оценки.

Запустить запрос (GenerateQuest)

Заголовок функции:

Function GenerateQuest(Name : PString; Arguments : PRealArray) : Logic

Описание аргументов

Name – указатель на символьную строку, содержащую имя запроса.

Arguments – массив, содержащий адреса аргументов запроса.

Функция генерирует запрос к макрокомпоненту нейрокомпьютер на исполнение запроса, имя которого указано в аргументе Name, с аргументами, адреса которых указаны в аргументе Arguments. Действуют следующие ограничения. В строке, содержащей имя запроса должно содержаться только одно слово – имя запроса. Ведущие и хвостовые пробелы подавляются. В массиве Arguments должно содержаться ровно столько элементов, сколько аргументов у генерируемого запроса. В массив Arguments всегда складываются адреса аргументов, даже если в запрос данный аргумент передается по значению.

Язык описания учителя

В отличие от таких компонентов как оценка, сеть и интерпретатор ответа, учитель не является составным объектом. Однако учитель может состоять из множества функций, вызывающих друг друга. Собственно учитель – это процедура, управляющая обучением сети. Ключевые слова, специфические для языка описания учителя приведены в табл. 7

Библиотеки функций учителя

Библиотеки функций учителя содержат описание функций, необходимых для работы одного или нескольких учителей. Использование библиотек позволяет избежать дублирования функций в различных учителях. Описание библиотеки функций аналогично описанию учителя, но не содержит главной процедуры.

Таблица 37.

Ключевые слова специфические для языка описания учителя

Идентификатор Краткое описание
Main Начало главной процедуры
Instructor Заголовок описания учителя
InstrLib Заголовок описания библиотеки функций
Used Подключение библиотек функций
Init Начало блока инициации
InstrStep Начало блока одного шага обучения
Close Начало блока завершения обучения

БНФ языка описания учителя

Обозначения, принятые в данном расширении БНФ и описание ряда конструкций приведены в разделе «Описание языка описания компонентов».

<Описание библиотеки> ::= <Заголовок библиотеки> <Описание глобальных переменных> <Описание функций> <Конец описания библиотеки>

<Заголовок библиотеки> ::= InstrLib <Имя библиотеки> [Used <Список имен библиотек>]

<Имя библиотеки> ::= <Идентификатор>

<Список имен библиотек> ::= <Имя используемой библиотеки> [,<Список имен библиотек>]

<Имя используемой библиотеки> ::= <Идентификатор>

<Конец описания библиотеки> ::= End InstrLib

<Описание учителя> ::= <Заголовок учителя> <Описание глобальных переменных> <Описание функций> <Главная процедура> <Конец описания учителя>

<Заголовок учителя> ::= Instructor <Имя библиотеки> [Used <Список имен библиотек>]

<Главная процедура> ::= Main <Описание статических переменных> <Описание переменных> <Блок инициации> <Блок шага обучения> <Блок завершения>

<Блок инициации> ::= Init <Тело функции>

<Блок шага обучения> ::= InstrStep <Выражение типа Logic> <Тело функции>

<Блок завершения> ::= Close <Тело функции>

<Конец описания учителя> End Instructor

Описание языка описания учителя

Язык описания учителя является наиболее простым из всех языков описания компонент. Фактически все синтаксические конструкции этого языка описаны в разделе «Общий стандарт». В теле функции, являющемся частью главной процедуры недопустим оператор возврата значения, поскольку главная процедура не является функцией. Три раздела главной функции – блок инициации, блок одного шага обучения и блок завершения являются фрагментами одной процедуры. Выделение этих разделов необходимо для выполнения запроса «Выполнить N шагов обучения». Выполнение главной процедуры происходит следующим образом. Выполняется блок инициации. Выполнение блока одного шага обучения сети производится до тех пор, пока не наступит одно из следующих событий:

  1. программа выйдет из блока одного шага обучения сети прямым переходом на метку в другом разделе;
  1. нарушится условие, указанное в конструкции InstStep;
  1. компонент учитель получит запрос «Прервать обучение сети»;
  1. в случае выполнения запроса «Выполнить N шагов обучения» блок одного шага обучения сети выполнен N раз.

Далее выполняется блок завершения обучения.

Пример описания учителя

В данном разделе приведены описания некоторых методов обучения, описанных в разделе «Описание алгоритмов обучения».

Пример 1.

Instructor RandomFire;  {Метод случайной стрельбы с уменьшением радиуса}

Main                                         {Обучение ведется по всему обучающему множеству}

      Label Exit, Exit1;

      Static

             Integer Try Name "Число попыток при одном радиусе" Default 5;

             Real MinRadius Name "Минимальный радиус, при котором + "продолжается работа" Default 0.001;

             String NetName Name "Имя сети" Default "";

             Integer What Name "Что обучать" Default Parameters;

             Color InstColor Name "Цвет примеров обучающего множества" Default HFFFF; {По умолчанию}

             Integer OperColor Name "Операция для отбора цветов" Default CIn;

      Var                  {все примеры, в цвете которых есть хоть один единичный бит}

             PRealArray Map, DirectMap;          {Для хранения текущего и случайного массивов параметров}

             Real Est1, Est2;                                   {Для хранения текущей и случайной оценки}

             Real Radius;                                        {Текущий радиус}

             Integer TryNum, RadiusNum;          {Число попыток, номер использованного радиуса}

             Integer Handle;                                   {Номер сеанса задачника}

             String QName;                                    {Имя запроса}

Init

      Begin

             If Not SetInstructionObject (What, @NetName) Then GoTo Exit;             {Задаем объекты обучения}

             QName = "InitSession";                                 {Задаем имя запроса}

             Map = NewArray(mRealArray, 3);                {Создаем массив для аргументов запроса}

             If Map = Null Then GoTo Exit;

             TPointer(Map^[1]) = @InstColor;                 {Заносим адрес первого аргумента}

             TPointer(Map^[2]) = @OperColor;         {Заносим адрес второго аргумента}

             TPointer(Map^[3]) = @Handle;                     {Заносим адрес третьего аргумента}

             If Not GenerateQuest(@QName, Map) Then GoTo Exit;{Открываем сеанс работы с задачником}

             If Not FreeArray(mRealArray, Map) Then GoTo Exit;  {Освобождаем массив для аргументов}

{Собственно начало обучения}

            Map = CreateArray;                                               {Создаем вспомогательные массивы}

            DirectMap= CreateArray;

             If Map = Null Then GoTo Exit;

             If DirectMap= Null Then GoTo Exit;

             Est1 = Estimate(Handle, True);

             If Error <> 0 Then GoTo Exit;

             RadiusNum = 1;                                                                   {Обрабатываем первый радиус}

             Radius = 1 / RadiusNum;                                                   {Вычисляем первый радиус}

             If Not SaveArray(Map) Then GoTo Exit;                  {Сохраняем начальный массив параметров}

      End

InstrStep Radius > MinRadius                            {Обработка с одним радиусом – один шаг обучения}

      Begin 

             TryNum = 0;

             While TryNum < Try Do Begin

                   If Not SetArray(Map) Then GoTo Exit;               {Устанавливаем лучший массив параметров}

                   If Not RandomArray(DirectMap) Then GoTo Exit; {Генерируется новый массив параметров}

                   If Not Modify(DirectMap, 1, Radius) Then GoTo Exit; {Модифицируем массив параметров}

                  Est2 = Estimate(Handle, True);

                   If Error <> 0 Then GoTo Exit;

                   If Est1>Est2 Then Begin

                         If Not SaveArray(Map) Then GoTo Exit;     {Сохраняем лучший массив параметров}

                         Est1 = Est2;

                         TryNum = 0;

                   End Else TryNum = TryNum + 1;            {Увеличиваем счетчик отказов}

             End

             RadiusNum = RadiusNum + 1;                       {Обрабатываем следующий радиус}

             Radius = 1 / RadiusNum;                                {Вычисляем следующий радиус}

      End

Close

      Begin

Exit:

             If Not SetArray(Map) Then;              {Восстанавливаем лучший массив параметров}

             If Not EraseArray(Мар1) Then;        {Освобождаем вспомогательные массивы}

             If Not EraseArray(Мар2) Then;

             QName = "CloseSession";                       {Задаем имя запроса}

             Map = NewArray(mRealArray, 1);   {Создаем массив для аргументов запроса}

             If Map = Null Then GoTo Exit1;

             TPointer(Map^[1]) = @Handle;        {Заносим адрес единственного аргумента}

             If Not GenerateQuest(@QName, Map) Then;{Открываем сеанс работы с задачником}

             If Not FreeArray(mRealArray, Map) Then; {Освобождаем массив для аргументов}

Exit1:

      End

End Instructor

Пример 2. Библиотека функций

InstrLib Library1;            {Библиотека содержит функции для следующего учителя}

{Метод наискорейшего спуска}

      Function SDM( Handle : Integer; Step : Real) : Real;

      Label Exit, Endd;

      Var

             Real Est;

      Begin

             Est = CalcGradient(Handle, True);

             If Error <> 0 Then GoTo Exit;

             Est = Optimize(Null, Step);                             {Вызываем функцию подбора оптимального шага}

             If Error <> 0 Then GoTo Exit;

             SDM = Est;

             GoTo Endd;

Exit:

             SDM = 0;

Endd:

      End

{Метод случайного поиска}

      Function RDM( Handle : Integer; Step : Real) : Real;

      Label Exit, Endd;

      Var

             Real Est;

             PRealArray : Direction;

      Begin

            Direction = CreateArray;                                {Создаем вспомогательный массив}

             If Direction = Null Then GoTo Exit;

            If Not RandomArray(Direction) Then GoTo Exit;    {Генерируется новый массив параметров}

             If Error <> 0 Then GoTo Exit;

             Est = Optimize(Direction, Step);                    {Вызываем функцию подбора оптимального шага}

             If Error <> 0 Then GoTo Exit;

             RDM = Est;

             GoTo Endd;

Exit:

             RDM = 0;

Endd:

      End

End InstrLib

Пример 3. Антиовражная процедура обучения.

Instructor kParTan Used Library1; {Антиовражная процедура обучения kParTan}

Main                                                {Обучение ведется по всему обучающему множеству}

      Label Exit, Exit1;

      Static

             Color InstColor Name "Цвет примеров обучающего множества"

                         Default HFFFF; {По умолчанию}

             Integer OperColor Name "Операция для отбора цветов" Default CIn;

{все примеры, в цвете которых есть хоть один единичный бит }

             String NetName Name "Имя сети" Default "";

             Integer What Name "Что обучать" Default Parameters;

{По умолчанию 2ParTan}

             Integer k Name "Число шагов между ParTan шагами" Default 2;  

             Real Accuracy Name "Требуемый минимум оценки" Default 0.00001;

             Logic Direction Name "Случайное направление или антиградиент"

             11Default True; {Если истина, то антиградиент }

      Var

             Integer Handle;                                   {Номер сеанса задачника}

             String QName;                                    {Имя запроса}

             PRealArray Map1, DirectMap; {Для текущего массива параметров и ParTan направления}

             Real Step, ParTanStep;                      {Длины шагов для оптимизации шага}

             Real Est1, Est2;                                   {Для хранения текущей и случайной оценки}

             Long I;

Init

      Begin

             If Not SetInstructionObject (What, @NetName) Then GoTo Exit;             {Задаем объекты обучения}

             QName = "InitSession";                                                                 {Задаем имя запроса}

             Map1 = NewArray(mRealArray, 3);{Создаем массив для аргументов запроса}

             If Map = Null Then GoTo Exit;

             TPointer(Map^[1]) = @InstColor;                 {Заносим адрес первого аргумента}

             TPointer(Map^[2]) = @OperColor;         {Заносим адрес второго аргумента}

             TPointer(Map^[3]) = @Handle;              {Заносим адрес третьего аргумента}

             If Not GenerateQuMap(@QName, Map) Then GoTo Exit;{Открываем сеанс работы с задачником}

             If Not FreeArray(mRealArray, Map) Then GoTo Exit;         {Освобождаем массив для аргументов}

{Собственно начало обучения}

            Map = CreateArray;                                        {Создаем вспомогательные массивы}

            DirectMap= CreateArray;

             If Map = Null Then GoTo Exit;

             If DirectMap = Null Then GoTo Exit;

             Est1 = Accuracy*10;       {Задаем оценку, не удовлетворяющую требованию точности}

             Step = 0.005;                            {Задаем начальное значение шагу}

      End

InstrStep Est > Accuracy

      Begin

             If Not SaveArray(Map1) Then GoTo Exit;                {Сохраняем начальный массив параметров}

             For I = 1 To k Do Begin                                  {Выполняем k межпартанных шагов}

                   If Direct Then Est = SDM(Handle, Step) Else Est = RDM(Handle, Step);

                   If Error <> 0 Then GoTo Exit;

             End;

             If Not SaveArray(DirectMap) Then GoTo Exit;       {Сохраняем конечный массив параметров}

             For I = 1 To TLong(Map^[0]) Do

                   DirectMap^[I] = DirectMap^[I] - Map^[I];         {Вычисляем направление ParTan шага}

             ParTanStep = 1;                                                                   {Задаем начальное значение ParTan шагу}

             Est = Optimize(DirectMap, ParTanStep);                        {Вызываем функцию подбора оптимального шага}

             If Error <> 0 Then GoTo Exit;

      End

Close

      Begin

Exit:

             If Not EraseArray(Мар) Then;          {Освобождаем вспомогательные массивы}

             If Not EraseArray(DirectMap) Then;

             QName = "CloseSession";                                                                   {Задаем имя запроса}

             Map = NewArray(mRealArray, 1);   {Создаем массив для аргументов запроса}

             If Map = Null Then GoTo Exit1;

             TPointer(Map^[1]) = @Handle;        {Заносим адрес единственного аргумента}

             If Not GenerateQuest(@QName, Map) Then;{Открываем сеанс работы с задачником}

             If Not FreeArray(mRealArray, Map) Then; {Освобождаем массив для аргументов}

Exit1:

      End

End Instructor

Стандарт второго уровня компонента учитель

Компонент учитель одновременно работает только с одним учителем. Запросы к компоненту учитель можно разбить на следующие группы.

  1. Обучение сети.
  1. Чтение/запись учителя.
  1. Инициация редактора учителя.
  1. Работа с параметрами учителя.

Обучение сети

К данной группе относятся три запроса – обучить сеть (InstructNet), провести N шагов обучения (NInstructSteps) и прервать обучение (CloseInstruction).

Обучить сеть (InstructNet)

Описание запроса:

Pascal:

Function InstructNet : Logic;

C:

Logic InstructNet()

Аргументов нет.

Назначение – производит обучение сети.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса учитель не загружен, то возникает ошибка 601 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Выполняется главная процедура загруженного учителя.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error равно нулю, то генерируется внутренняя ошибка 605 – ошибка исполнения учителя, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error не равно нулю, то обработка запроса прекращается.

Провести N шагов обучения (NInstructSteps)

Описание запроса:

Pascal:

Function NInstructNet( N : Integer ) : Logic;

C:

Logic NInstructNet(Integer N)

Описание аргумента:

N – число выполнений блока одного шага обучения сети.

Назначение – производит обучение сети.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса учитель не загружен, то возникает ошибка 601 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Выполняется блок инициации главной процедуры загруженного учителя, N раз выполняется блок одного шага обучения, выполняется блок завершения обучения.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error равно нулю, то генерируется внутренняя ошибка 605 – ошибка исполнения учителя, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error не равно нулю, то обработка запроса прекращается.

Прервать обучение (CloseInstruction)

Описание запроса:

Pascal:

Function CloseInstruction: Logic;

C:

Logic CloseInstruction()

Аргументов нет.

Назначение – прерывает обучение сети.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса учитель не загружен, то возникает ошибка 601 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если в момент получения запроса не выполняется ни один из запросов обучить сеть (InstructNet) или провести N шагов обучения (NInstructSteps), то возникает ошибка 606 – неверное использование запроса на прерывание обучения, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Завершается выполнение текущего шага обучения сети.
  1. Выполняется блок завершения обучения сети.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error равно нулю, то генерируется внутренняя ошибка 605 – ошибка исполнения учителя, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error не равно нулю, то обработка запроса прекращается.

Чтение/запись учителя

В данном разделе описаны запросы, позволяющие загрузить учителя с диска или из памяти, выгрузить учителя и сохранить текущего учителя на диске или в памяти.

Прочитать учителя (inAdd)

Описание запроса:

Pascal:

Function inAdd( CompName : PString ) : Logic;

C:

Logic inAdd(PString CompName)

Описание аргумента:

CompName – указатель на строку символов, содержащую имя файла компонента или адрес описания компонента.

Назначение – читает учителя с диска или из памяти.

Описание исполнения.

  1. Если в качестве аргумента CompName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя компонента и после пробела имя файла, содержащего компоненту. В противном случае считается, что аргумент CompName содержит указатель на область памяти, содержащую описание компонента в формате для записи на диск. Если описание не вмещается в одну область памяти, то допускается включение в текст описания компонента ключевого слова Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.
  1. Если в данный момент загружен другой учитель, то выполняется запрос inDelete. Учитель считывается из файла или из памяти.
  1. Если считывание завершается по ошибке, то возникает ошибка 602 – ошибка считывания учителя, управление передается обработчику ошибок, а обработка запроса прекращается.

Удаление учителя (inDelete)

Описание запроса:

Pascal:

Function inDelete : Logic;

C:

Logic inDelete()

Аргументов нет.

Назначение – удаляет загруженного в память учителя.

Описание исполнения.

  1. Если список в момент получения запроса учитель не загружен, то возникает ошибка 601 – неверное имя учителя, управление передается обработчику ошибок, а обработка запроса прекращается.

Запись компонента (inWrite)

Описание запроса:

Pascal:

Function inWrite(Var FileName : PString) : Logic;

C:

Logic inWrite(PString* FileName)

Описание аргументов:

CompName – указатель на строку символов, содержащую имя компонента.

FileName – имя файла или адрес памяти, куда надо записать компонент.

Назначение – сохраняет учителя в файле или в памяти.

Описание исполнения.

  1. Если в момент получения запроса учитель не загружен, то возникает ошибка 601 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если в качестве аргумента FileName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя файла для записи компонента. В противном случае FileName должен содержать пустой указатель. В этом случае запрос вернет в нем указатель на область памяти, куда будет помещено описание компонента в формате для записи на диск. Если описание не вмещается в одну область памяти, то в текст будет включено ключевое слово Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.
  1. Если во время сохранения компонента возникнет ошибка, то возникает ошибка 603 – ошибка сохранения компонента, управление передается обработчику ошибок, а обработка запроса прекращается.

Инициация редактора учителя

К этой группе запросов относится запрос, который инициирует работу не рассматриваемого в данной работе компонента – редактора учителя.

Редактировать компонент (inEdit)

Описание запроса:

Pascal:

Procedure inEdit(CompName : PString);

C:

void inEdit(PString CompName)

Описание аргумента:

CompName – указатель на строку символов – имя файла или адрес памяти, содержащие описание учителя.

Если в качестве аргумента CompName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя учителя и после пробела имя файла, содержащего описание учителя. В противном случае считается, что аргумент CompName содержит указатель на область памяти, содержащую описание учителя в формате для записи на диск. Если описание не вмещается в одну область памяти, то допускается включение в текст описания ключевого слова Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.

Если в качестве аргумента CompName передан пустой указатель или указатель на пустую строку, то редактор создает нового учителя.

Работа с параметрами учителя

В данном разделе описаны запросы, позволяющие изменять параметры учителя.

Получить параметры (inGetData)

Описание запроса:

Pascal:

Function inGetData(Var Param : PRealArray ) : Logic;

C:

Logic inGetData(PRealArray* Param)

Описание аргумента:

Param – адрес массива параметров.

Назначение – возвращает вектор параметров учителя.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса учитель не загружен, то возникает ошибка 601 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В массив, адрес которого передан в аргументе Param, заносятся значения параметров. Параметры заносятся в массив в порядке описания в разделе описания статических переменных.

Получить имена параметров (inGetName)

Описание запроса:

Pascal:

Function inGetName(Var Param : PRealArray ) : Logic;

C:

Logic inGetName(PRealArray* Param)

Описание аргумента:

Param – адрес массива указателей на названия параметров.

Назначение – возвращает вектор указателей на названия параметров учителя.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса учитель не загружен, то возникает ошибка 601 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В массив, адрес которого передан в аргументе Param, заносятся адреса символьных строк, содержащих названия параметров.

Установить параметры (inSetData)

Описание запроса:

Pascal:

Function inSetData(Param : PRealArray ) : Logic;

C:

Logic inSetData(PRealArray Param)

Описание аргументов:

Param – адрес массива параметров.

Назначение – заменяет значения параметров учителя на значения, переданные, в аргументе Param.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса учитель не загружен, то возникает ошибка 601 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Параметры, значения которых хранятся в массиве, адрес которого передан в аргументе Param, передаются учителю.

Обработка ошибок

В табл. 38 приведен полный список ошибок, которые могут возникать при выполнении запросов компонентом учитель, и действия стандартного обработчика ошибок.

Таблица 38.

Ошибки компонента учитель и действия стандартного обработчика ошибок.

Название ошибки Стандартная обработка
601 Несовместимость сети и учителя Занесение номера в Error
602 Ошибка считывания учителя Занесение номера в Error
603 Ошибка сохранения учителя Занесение номера в Error
604 Некорректная работа с памятью Занесение номера в Error
605 Ошибка исполнения учителя Занесение номера в Error
606 Неверное использование запроса на прерывание обучения Занесение номера в Error

Стандарт первого уровня компонента контрастер

В этом разделе приводится стандарт языка описания компонента контрастер. Компонент контрастер во многом подобен компоненту учитель. Так в языке описания компонента контрастер допускается использование функций, описанных в разделе «Список стандартных функций».

Язык описания контрастера

В отличие от таких компонент как оценка, сеть и интерпретатор ответа, контрастер не является составным объектом. Однако, контрастер может состоять из множества функций, вызывающих друг друга. Собственно контрастер – это процедура, управляющая процессом контрастирования. Ключевые слова, специфические для языка описания контрастера приведены в табл. 39

Библиотеки функций контрастера

Таблица 39.

Ключевые слова для языка описания контрастера
Ключевое слово Краткое описание
1.     Main Начало главной процедуры
2.     Contrast Заголовок описания контрастера
3.     ContrLib Заголовок описания библиотеки функций
4.     Used Подключение библиотек функций
5.     ContrastFunc Глобальная переменная типа функция.

Библиотеки функций контрастера содержат описание функций, необходимых для работы одного или нескольких контрастеров. Использование библиотек позволяет избежать дублирования функций в различных контрастерах. Описание библиотеки функций аналогично описанию контрастера, но не содержит главной процедуры.

БНФ языка описания контрастера

Обозначения, принятые в данном расширении БНФ и описание ряда конструкций приведены в разделе «Описание языка описания компонентов».

<Описание библиотеки> ::= <Заголовок библиотеки> <Описание глобальных переменных> <Описание функций> <Конец описания библиотеки>

<Заголовок библиотеки> ::= ContrLib <Имя библиотеки> [Used <Список имен библиотек>]

<Имя библиотеки> ::= <Идентификатор>

<Список имен библиотек> ::= <Имя используемой библиотеки> [,<Список имен библиотек>]

<Имя используемой библиотеки> ::= <Идентификатор>

<Конец описания библиотеки> ::= End ContrLib

<Описание контрастера> ::= <Заголовок контрастера> <Описание глобальных переменных> <Описание функций> <Главная процедура> <Конец описания контрастера>

<Заголовок контрастера> ::= Contrast <Имя библиотеки> [Used <Список имен библиотек>]

<Главная процедура> ::= Main <Описание статических переменных> <Описание переменных> <Тело функции>

<Конец описания контрастера> End Contrast

Описание языка описания контрастера

Язык описания контрастера является наиболее простым из всех языков описания компонент. Фактически все синтаксические конструкции этого языка описаны в разделе «Общий стандарт». В теле функции, являющемся частью главной процедуры недопустим оператор возврата значения, поскольку главная процедура не является функцией.

Контрастер имеет одну глобальную предопределенную переменную ContrastFunc. Эта переменная должна обязательно быть определена – ей нужно присвоить адрес функции, которая будет вызываться каждый раз после того, как нейронная сеть вычислит градиент после решения одного примера. Функция, адрес которой присваивается переменной ContrastFunc должна быть объявлена следующим образом:

Function MyContrast( TheEnd : Logic ) : Logic;

Значения аргумента TheEnd имеют следующий смысл: истина – обучение ведется позадачно или закончен просмотр обучающего множества; ложь – обработан еще один пример обучающего множества при обучении по всему задачнику в целом. Следует учесть, что при обучении по всему обучающему множеству в целом, нейронная сеть накапливает градиенты всех примеров, так что при первом вызове функции в сети хранится градиент функции оценки по результатам решения первого примера; при втором – результатам решения первых двух примеров и т.д. Функция возвращает значение ложь, если в ходе ее работы произошла ошибка. В противном случае она возвращает значение истина.

Значение переменной ContrastFunc присваивается оператором присваивания:

ContrastFunc = MyContrast

Если значение переменной ContrastFunc не задано, то она указывает на используемую по умолчанию функцию EmptyContrast, которая просто возвращает значение истина.

Стандарт второго уровня компонента контрастер

Компонента контрастер одновременно работает только с одним контрастером. Запросы к компоненте контрастер можно разбить на следующие группы.

  1. Контрастирование сети.
  1. Чтение/запись контрастера.
  1. Инициация редактора контрастера.
  1. Работа с параметрами контрастера.

Контрастирование сети

К данной группе относятся три запроса – контрастировать сеть (ContrastNet), прервать контрастирование (CloseContrast) и контрастировать пример (ContrastExample).

Контрастировать сеть(ContrastNet)

Описание запроса:

Pascal:

Function ContrastNet: Logic;

C:

Logic ContrastNet()

Аргументов нет.

Назначение – производит контрастирование сети.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса контрастер не загружен, то возникает ошибка 701 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Выполняется главная процедура загруженного контрастера.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error равно нулю, то генерируется внутренняя ошибка 705 – ошибка исполнения контрастера, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error не равно нулю, то обработка запроса прекращается.

Прервать контрастирование (CloseContrast)

Описание запроса:

Pascal:

Function CloseContrast: Logic;

C:

Logic CloseContrast()

Аргументов нет.

Назначение – прерывает контрастирование сети.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса контрастер не загружен, то возникает ошибка 701 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если в момент получения запроса не выполняется запрос ContrastNet, то возникает ошибка 706 – неверное использование запроса на прерывание контрастирования, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Завершается выполнение текущего шага контрастирования сети.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error равно нулю, то генерируется внутренняя ошибка 705 – ошибка исполнения контрастера, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если во время выполнения запроса возникает ошибка, а значение переменной Error не равно нулю, то обработка запроса прекращается.

Контрастировать пример (ContrastExample)

Описание запроса:

Pascal:

Function ContrastExample( TheEnd : Logic) : Logic;

C:

Logic ContrastExample(Logic TheEnd )

Описание аргумента:

TheEnd – значение аргумента имеет следующий смысл: ложь – обработан еще один пример обучающего множества при обучении по всему задачнику в целом.

Назначение – извлекает из сети необходимые для вычисления показателей значимости параметры.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Вызывает функцию, адрес которой хранится в переменной ContrastFunc, передавая ей аргумент TheEnd в качестве аргумента.
  1. Если функция ContrastFunc возвращает значение ложь, а значение переменной Error равно нулю, то генерируется внутренняя ошибка 705 – ошибка исполнения контрастера, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если функция ContrastFunc возвращает значение ложь, а значение переменной Error не равно нулю, то обработка запроса прекращается.
  1. Запрос в качестве результата возвращает возвращенное функцией ContrastFunc значение.

Чтение/запись контрастера

В данном разделе описаны запросы позволяющие, загрузить контрастер с диска или из памяти, выгрузить контрастера и сохранить текущего контрастера на диске или в памяти.

Прочитать контрастера (cnAdd)

Описание запроса:

Pascal:

Function cnAdd( CompName : PString ) : Logic;

C:

Logic cnAdd(PString CompName)

Описание аргумента:

CompName – указатель на строку символов, содержащую имя файла компонента или адрес описания компонента.

Назначение – читает контрастера с диска или из памяти.

Описание исполнения.

  1. Если в качестве аргумента CompName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя компонента и после пробела имя файла, содержащего компонент. В противном случае считается, что аргумент CompName содержит указатель на область памяти, содержащую описание компонента в формате для записи на диск. Если описание не вмещается в одну область памяти, то допускается включение в текст описания компонента ключевого слова Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.
  1. Если в данный момент загружен другой контрастер, то выполняется запрос cnDelete. Контрастер считывается из файла или из памяти.
  1. Если считывание завершается по ошибке, то возникает ошибка 702 – ошибка считывания контрастера, управление передается обработчику ошибок, а обработка запроса прекращается.

Удаление контрастера (cnDelete)

Описание запроса:

Pascal:

Function cnDelete : Logic;

C:

Logic cnDelete()

Аргументов нет.

Назначение – удаляет загруженного в память контрастера.

Описание исполнения.

  1. Если список в момент получения запроса контрастер не загружен, то возникает ошибка 701 – неверное имя контрастера, управление передается обработчику ошибок, а обработка запроса прекращается.

Запись контрастера (cnWrite)

Описание запроса:

Pascal:

Function cnWrite(Var FileName : PString) : Logic;

C:

Logic cnWrite(PString* FileName)

Описание аргументов:

CompName – указатель на строку символов, содержащую имя контрастера.

FileName – имя файла или адрес памяти, куда надо записать контрастера.

Назначение – сохраняет контрастера в файле или в памяти.

Описание исполнения.

  1. Если в момент получения запроса контрастер не загружен, то возникает ошибка 701 – неверное имя контрастера, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Если в качестве аргумента FileName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя файла, для записи компонента. В противном случае FileName должен содержать пустой указатель. В этом случае запрос вернет в нем указатель на область памяти, куда будет помещено описание компонента в формате для записи на диск. Если описание не вмещается в одну область памяти, то в текст будет включено ключевое слово Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.
  1. Если во время сохранения компонента возникнет ошибка, то возникает ошибка 703 – ошибка сохранения контрастера, управление передается обработчику ошибок, а обработка запроса прекращается.

Инициация редактора контрастера

К этой группе запросов относится запрос, который инициирует работу не рассматриваемого в данной работе компонента – редактора контрастера.

Редактировать контрастера (cnEdit)

Описание запроса:

Pascal:

Procedure cnEdit(CompName : PString);

C:

void cnEdit(PString CompName)

Описание аргумента:

CompName – указатель на строку символов – имя файла или адрес памяти, содержащие описание контрастера.

Если в качестве аргумента CompName дана строка, первые четыре символа которой составляют слово File, то остальная часть строки содержит имя контрастера и после пробела имя файла, содержащего описание контрастера. В противном случае считается, что аргумент CompName содержит указатель на область памяти, содержащую описание контрастера в формате для записи на диск. Если описание не вмещается в одну область памяти, то допускается включение в текст описания ключевого слова Continue, за которым следует четыре байта, содержащие адрес следующей области памяти.

Если в качестве аргумента CompName передан пустой указатель или указатель на пустую строку, то редактор создает нового контрастера.

Работа с параметрами контрастера

В данном разделе описаны запросы, позволяющие изменять параметры контрастера.

Получить параметры (cnGetData)

Описание запроса:

Pascal:

Function cnGetData(Var Param : PRealArray ) : Logic;

C:

Logic cnGetData(PRealArray* Param)

Описание аргумента:

Param – адрес массива параметров.

Назначение – возвращает вектор параметров контрастера.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса контрастер не загружен, то возникает ошибка 701 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В массив, адрес которого передан в аргументе Param, заносятся значения параметров. Параметры заносятся в массив в порядке описания в разделе описания статических переменных.

Получить имена параметров (cnGetName)

Описание запроса:

Pascal:

Function cnGetName(Var Param : PRealArray ) : Logic;

C:

Logic cnGetName(PRealArray* Param)

Описание аргумента:

Param – адрес массива указателей на названия параметров.

Назначение – возвращает вектор указателей на названия параметров.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса контрастер не загружен, то возникает ошибка 701 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. В массив, адрес которого передан в аргументе Param, заносятся адреса символьных строк, содержащих названия параметров.

Установить параметры (cnSetData)

Описание запроса:

Pascal:

Function cnSetData(Param : PRealArray ) : Logic;

C:

Logic cnSetData(PRealArray Param)

Описание аргументов:

Param – адрес массива параметров.

Назначение – заменяет значения параметров контрастера на значения, переданные, в аргументе Param.

Описание исполнения.

  1. Если Error <> 0, то выполнение запроса прекращается.
  1. Если в момент получения запроса контрастер не загружен, то возникает ошибка 701 – неверное имя компонента, управление передается обработчику ошибок, а обработка запроса прекращается.
  1. Параметры, значения которых хранятся в массиве, адрес которого передан в аргументе Param, передаются контрастеру.

Обработка ошибок

В табл. 40 приведен полный список ошибок, которые могут возникать при выполнении запросов компонентом контрастер, и действия стандартного обработчика ошибок.

Таблица 40.

Ошибки компонента контрастер и действия стандартного обработчика ошибок.

Название ошибки Стандартная обработка
701 Несовместимость сети и контрастера Занесение номера в Error
702 Ошибка считывания контрастера Занесение номера в Error
703 Ошибка сохранения контрастера Занесение номера в Error
704 Некорректная работа с памятью Занесение номера в Error
705 Ошибка исполнения контрастера Занесение номера в Error
706 Неверное использование запроса на прерывание контрастирования Занесение номера в Error

 


Оглавление | Введение | П1 | П2 | П3 | Литература
Лекции: 1, 2-3, 4-6, 7.1, 7.2, 8, 9, 10, 11.1, 11.2-12, 13-14, 15-16